Tkinter 透明度问题

2 投票
1 回答
6008 浏览
提问于 2025-04-16 02:16

我在使用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()

撰写回答