打开时如何使tkinter窗口已经透明?

时间:2020-11-10 08:19:34

标签: python-3.x tkinter

我希望黑色窗口淡入。在全屏模式下,它可以正常工作,但是我需要特定的大小,在打开该窗口时,它首先显示为黑色,然后变为透明并开始褪色。您有什么想法可以实现与全屏版本一样的流畅效果吗?

import tkinter as tk
 
class Fader(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.parent.attributes("-alpha",0.0)
        #self.parent.attributes("-fullscreen",True)
        self.parent.geometry("600x800")
        self.configure(bg='black')
        self.fade_in()       
 
    def fade_in(self):
        alpha = self.parent.attributes("-alpha")
        if alpha < 1:
            alpha += .01
            self.parent.attributes("-alpha", alpha)
            self.after(100, self.fade_in)
 
if __name__ == "__main__":
    root = tk.Tk()
    root.bind("<Escape>",lambda e: root.destroy())
    Fader(root).pack(fill="both", expand=True)
    root.mainloop()

1 个答案:

答案 0 :(得分:0)

您可以使用withdraw()隐藏窗口,然后使用deiconify()稍后显示窗口并增加Alpha。但这似乎不起作用,除非您更新任务或等待窗口可见。

方法1: 能够使用update_idletasks()来解决此问题,例如:

class Fader(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.parent.attributes('-alpha',0.0)
        self.parent.withdraw() #hiding the window
        #self.parent.attributes("-fullscreen",True)
        self.parent.update_idletasks() 
        self.parent.geometry("600x800")
        self.configure(bg='black')
        self.fade_in()
 
    def fade_in(self):
        self.parent.deiconify() #bringing it back
        ..... #same code

方法2: 或如acw1668所说,您可以使用wait_visibility(),例如:

class Fader(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.parent.wait_visibility(self.parent)
        self.parent.attributes('-alpha',0.0)
        self.parent.withdraw()
        # self.parent.attributes("-fullscreen",True)
        self.parent.geometry("600x800")
        self.configure(bg='black')
        self.fade_in()
 
    def fade_in(self):
        self.parent.deiconify()
        ...... #same code

有关wait_visibility()的更多信息:

wait_visibility(窗口=无) 等待给定的小部件可见。这通常用于等待屏幕上出现新的顶层窗口。与wait_variable一样,此方法进入本地事件循环,因此应用程序的其他部分仍将照常工作。

有关update_idletasks()的更多信息:

update_idletasks() 调用所有待处理的空闲任务,而不处理任何其他事件。可以用于执行几何管理并在必要时重绘窗口小部件,而无需调用任何回调。

来源:-https://effbot.org/tkinterbook/widget.htm

相关问题