2010-08-03 59 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