Tkinter 透明度问题
我在使用TKinter时遇到了一些问题,想让一个顶层窗口渐渐显示出来。但是这个窗口根本没有渐变显示,只有在我点击运行这个命令的按钮两次后,它才会出现在任务栏里(其实它不应该出现在任务栏的)。
导致这些问题的代码如下:
Alpha = 0.0
w1.attributes("-alpha", Alpha)
w1.wm_geometry("+" + str(X) + "+" + str(M))
while 1.0 > Alpha :
Alpha = Alpha + 0.01
w1.attributes("-alpha", Alpha)
sleep(0.005)
这是在Windows 7上使用的Python 2.6。
1 个回答
7
问题在于你的代码从来没有让窗口重新绘制自己。使用 Sleep 会让程序停止,这样事件循环就无法运行,而正是这个事件循环让窗口得以显示。
与其让程序睡觉,不如利用事件循环,每隔 N 毫秒更新一次属性,直到你得到想要的透明度效果。
这里有一个在 Mac 上可以运行的例子。我猜在 Windows 上也能用。
import Tkinter as tk
class App:
def __init__(self):
self.root = tk.Tk()
self.count = 0
b=tk.Button(text="create window", command=self.create_window)
b.pack()
self.root.mainloop()
def create_window(self):
self.count += 1
t=FadeToplevel(self.root)
t.wm_title("Window %s" % self.count)
t.fade_in()
class FadeToplevel(tk.Toplevel):
'''A toplevel widget with the ability to fade in'''
def __init__(self, *args, **kwargs):
tk.Toplevel.__init__(self, *args, **kwargs)
self.attributes("-alpha", 0.0)
def fade_in(self):
alpha = self.attributes("-alpha")
alpha = min(alpha + .01, 1.0)
self.attributes("-alpha", alpha)
if alpha < 1.0:
self.after(10, self.fade_in)
if __name__ == "__main__":
app=App()