1

我正在使用 TKinter 构建一个接口,但我遇到了一个问题,即每当创建一个新窗口时,200x200 像素的标准化 tkinter 窗口中什么都没有,它会在几分之一秒内闪烁,并且在我所有的修改(小部件等)之后制成。这发生在调用主循环之前和之后。

  • 主界面已创建。
  • 主循环统计
  • 闪烁的窗口
  • 主界面出现

同样在调用 Mainloop 之后,新创建的窗口也会发生这种情况。

  • 出现主界面 - >按下按钮,创建一个新窗口
  • 闪烁的窗口
  • 出现新窗口

遗憾的是我不能给你一个示例代码......如果我尝试做一个最小的例子,这不会发生。也许创建了标准窗口,但它改变得太快了,以至于它没有出现在屏幕上。我什至不知道在这种情况下要查找什么......搜索“tkinter flashing window”一无所获。

编辑:我找到了问题的根源。它似乎是由和引起wm_iconbitmap的。如果您从代码中删除图标,它可以正常工作,不会闪烁。但是,如果我将它与另一个一起使用,则窗口在创建时会闪烁。试试下面的代码。当然,您必须将图标放在工作目录中。FigureCanvasTkAggtkinter.Toplevel

这是一个代码示例和我正在使用的图标的链接,但我想任何图标都可以。

# coding=utf-8
import numpy as np
import matplotlib as mpl
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import os

class INTERFACE(object):
    def __init__(self):
        self.root = tk.Tk()
        self.root.protocol("WM_DELETE_WINDOW", self.EXIT)
        self.root.wm_iconbitmap( os.path.abspath("icon.ico"))  #<---- !!!!!!
        self.root.geometry("1024x768")
        canvas = FigureCanvasTkAgg(self.testfigure(), master=self.root) #<---- !!!!!!
        canvas.get_tk_widget().grid(sticky=tk.N+tk.W+tk.E+tk.S)
        self.root.rowconfigure(0, weight=1)
        self.root.columnconfigure(0, weight=1)
    def testfigure(self):
        x=np.linspace(0, 2*np.pi,100)
        y=np.sin(x)
        fig = mpl.figure.Figure()
        sub = fig.add_subplot(111)
        sub.plot(x,y)
        return fig

    def EXIT(self):
        Top = tk.Toplevel(master=self.root)
        Top.wm_iconbitmap( os.path.abspath("icon.ico"))  #<---- !!!!!!
        Top.transient(self.root)
        Top.resizable(width=False, height=False)
        Top.title("Exit")

        tk.Message(Top,text="Do you really want to quit?", justify=tk.CENTER, width=300).grid(row=0,columnspan=3)
        tk.Button(Top,text="YES",command=self.root.destroy).grid(row=1,column=0)
        tk.Button(Top,text="No",command=self.root.destroy).grid(row=1,column=1)
        tk.Button(Top,text="Maybe",command=self.root.destroy).grid(row=1,column=2)
    def start(self):
        self.root.mainloop()

if __name__ == '__main__':
    INTERFACE().start()
4

3 回答 3

1

我知道这是一个老问题,但我经历过类似的情况并找到了解决方案。

就我而言,我已将问题隔离到使用iconbitmap. 我已经设法通过iconbitmapafter调用root.mainloop().

例子:

from tkinter import *

    root = Tk()

    w = Label(root, text="Hello, world!")
    w.pack()

    root.geometry('300x300+500+500')
    root.after(50, root.iconbitmap('icon.ico'))
    root.mainloop()

此方法也适用于带有图标的 Toplevel() 窗口。

使用 Python 3.5.0 在 Win 8.1 上测试。

编辑:经过进一步检查,我注意到行为也相对于root.geometry' 的存在发生了变化。我最初的例子没有它,我只是在几次尝试后才注意到它仍然有同样的问题。该after方法的时间延迟似乎没有改变任何东西。

出于某种原因,移到root.geometry该方法下方会产生相同的问题。after

于 2015-10-23T18:47:54.527 回答
0

最有可能的是,在您正在调用的初始化代码中的某个位置updateupdate_idletasks,这会导致在屏幕上绘制 GUI 的当前状态。

问题的另一个可能来源是,如果您正在创建多个实例,Tk而不是Toplevel.

但是,在没有看到您的代码的情况下,我们所能做的就是猜测。

解决此问题的最佳途径是创建一个具有相同行为的小示例。不是因为我们需要它来帮助您,而是因为您为重现错误所付出的努力可能会告诉您导致错误的原因。

于 2013-09-12T17:34:13.463 回答
0

这应该可以,但它需要 win32gui

import win32gui

def FlashMyWindow(title):
    ID = win32gui.FindWindow(None, title)
    win32gui.FlashWindow(ID,True)
于 2016-02-14T12:39:37.470 回答