我正在用TKinter构建一个接口,我有一个问题:每当创建一个新窗口时,标准的200x200像素的tkinter窗口就会闪烁一小部分秒,然后我所有的修改(小部件等等)都会闪烁起来。都是制造出来的。在调用This循环之前和之后都会发生这种情况。
同样,在Mainloop被调用之后,这也会发生在新创建的窗口中。
可惜我不能给你一个代码样本..。如果我试着做一个最小的例子,这种情况就不会发生。也许标准窗口被创建了,但是它的变化太快了,以至于它不会出现在屏幕上。我甚至不知道在这个案子里该查什么.搜索"tkinter闪烁窗口“不会产生任何结果。
编辑:我找到了问题的根源。这似乎是由wm_iconbitmap
,FigureCanvasTkAgg
和tkinter.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()
发布于 2015-10-23 18:47:54
我知道这是个老问题,但我也经历过类似的情况,并找到了解决办法。
在我的例子中,我将这个问题与iconbitmap
的使用隔离开来。在调用iconbitmap
之前,我通过使用after
方法调用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()窗口。
用Python3.5.0在Win 8.1上进行测试。
编辑:经过进一步的检查,我注意到相对于root.geometry
的存在,行为也发生了变化。我最初的例子没有,只是在几次尝试之后,我才注意到它仍然存在相同的问题。after
方法中的时间延迟似乎没有任何改变。
由于某种原因,将root.geometry
移到after
方法下面会产生同样的问题。
发布于 2013-09-12 17:34:13
最有可能的是,在初始化代码中调用update
或update_idletasks
,这会在屏幕上绘制GUI的当前状态。
问题的另一个可能来源是,如果要创建多个Tk
实例,而不是Toplevel
实例。
但是,没有看到您的代码,我们所能做的就是猜测。
解决这个问题的最好方法是创建一个具有相同行为的小示例。这并不是因为我们需要它来帮助您,而是因为您在重新创建bug方面所付出的努力可能会告诉您是什么导致了错误。
发布于 2016-02-14 12:39:37
这应该可以工作,但它需要win32gui
import win32gui
def FlashMyWindow(title):
ID = win32gui.FindWindow(None, title)
win32gui.FlashWindow(ID,True)
https://stackoverflow.com/questions/18769336
复制相似问题