首页 > 解决方案 > 打开时如何让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()

标签: python-3.xtkinter

解决方案


您可以使用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(window=None) 等待给定的小部件变得可见。这通常用于等到屏幕上出现新的顶层窗口。与 wait_variable 一样,此方法进入本地事件循环,因此应用程序的其他部分仍将照常工作。

更多关于update_idletasks()

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

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


推荐阅读