2010-08-03 60 views
2

我在使用顶级窗口小部件时遇到问题,在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) 

这是蟒蛇2.6在Windows 7

回答

6

的问题是,你的代码永远不会允许窗口重绘自身。睡眠会导致程序停止,因此不会输入事件循环,并且这是导致窗口被绘制的事件循环。

不是睡觉,而是利用事件循环,每N毫秒更新一次属性,直到获得所需的alpha透明度。

下面是一个可在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() 
+0

谢谢,我不知道睡眠有这样做的倾向。 – rectangletangle 2010-09-04 21:25:54