Возникли проблемы с прозрачностью Tkinter - PullRequest
2 голосов
/ 03 августа 2010

У меня проблемы с отображением виджета верхнего уровня в 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)

Это python 2.6 в Windows 7.

1 Ответ

6 голосов
/ 04 сентября 2010

Проблема в том, что ваш код никогда не позволяет окну перерисовывать себя. Спящий режим приводит к остановке программы, поэтому цикл событий не вводится, и именно цикл событий вызывает рисование окна.

Вместо сна используйте цикл обработки событий и обновляйте атрибуты каждые 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()
...