2010-08-03 2 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 миллисекунд, пока не получите желаемую альфа-прозрачность, которую вы хотите.

Вот пример, который работает на Mac. Я предполагаю, что это работает и на окнах.

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