有没有办法在Tkinter中创建透明窗口?

22

我试图使用Python中的Tkinter模块创建“奇形怪状的窗口”。但现在,我只想让背景透明,同时保持子部件完全可见。

我知道可以使用wxPython和其他一些模块来实现这一点,但我想了解一下Tkinter的限制。

Tkinter能否创建一个透明的画布或框架?它可以在没有画布或框架的情况下打包UI元素吗?单个UI元素能否透明?

它能否将鼠标点击位置传递回系统,以便处理位于它下面的任何窗口的Z堆栈?

2个回答

33

选项 root.attributes('-alpha', 0.1) 可以用来制作一个透明的窗口。

from Tkinter import *
root = Tk()
root.attributes('-alpha', 0.3)
root.mainloop()

然而,在这种情况下,甚至根部的小部件也会继承透明度。

针对Linux的更新(在Ubuntu上测试过)

上述代码在Linux机器上不起作用。这里是一个可以在Linux上运行的更新。

from tkinter import Tk # or(from Tkinter import Tk) on Python 2.x
root = Tk()
root.wait_visibility(root)
root.wm_attributes('-alpha',0.3)
root.mainloop()

不确定此方法是否适用于 Windows 操作系统。


3
对我来说,“窗口闪烁”现象不受“overrideredirect”调用的影响。我猜这是由于“wait_visibility”等待窗口完全可见,然后才允许添加“alpha”属性,从而导致了闪烁。 - bhaskarc
1
@tao 这太棒了。有没有办法使窗口框架不透明,但窗口内容透明? - crypdick
2
据我所知,在Tkinter中这是不可能的。 wm_attributes('-alpha',0.3)仅适用于顶级窗口,因此只能在顶级上添加透明度。 - bhaskarc
1
@martineau:Tkinter不允许像“Frame”这样的单个小部件透明。 - bhaskarc
1
@bhaskarc 有没有办法只让根部透明,而不是其中的项目? - Delrius Euphoria
显示剩余11条评论

7

2019年底总结:

从TCL/TK 8.6版本开始,alphafullscreentopmost窗口属性在所有平台(Windows、Mac和Linux)上都可以使用:

https://www.tcl.tk/man/tcl8.6/TkCmd/wm.htm#M9

以前的手册版本指出,以前存在平台差异(只有一些平台支持这3个属性)。但只要使用最新的TCL/TK版本,就保证这些属性在所有平台上都能工作!

在LINUX上仍然存在平台特定性,因为每个窗口属性功能都依赖于操作系统的底层窗口管理器(在Mac和Windows上它们总是可用的,但在Linux上有大量不同的窗口管理器/合成器,而且并非所有的都支持透明窗口等)。如果不支持透明度,则该页面中提到,如果稍后尝试再次读取,则alpha属性将保持为1.0。但是该页面还指出,在Linux(X11)上,属性是异步更新的,这意味着您不能信任您读取的值(如果您更改了alpha,然后立即尝试读取它,您仍然会读取旧值,因此您不能使用该方法来检查是否已成功更改Linux上的alpha)。

至于其他答案说您需要先在Linux上使用root.wait_visibility(root),以确保窗口在屏幕上可见,然后再设置alpha属性...我不知道,因为我没有Linux机器来检查。但是我非常怀疑它现在还需要,因为官方手册表示支持alpha,并且没有提到必须使用该命令。无论如何,加入wait_visibility技巧也无妨...它只是运行一个非常简短的事件循环,等待实际窗口出现在用户的屏幕上。因此,在所有属性设置之前添加该命令可能仍然是一个好主意。特别是因为已经被证明可以帮助旧版TCL/TK版本上的Linux中的alpha工作! PS:您不需要(root)参数,应该键入root.wait_visibility()而不是wait_visibility(root),这意味着“等待self(在这种情况下为根对象)”。

更新:

评论区的Daniel让我知道,在Ubuntu 19.10上仍然需要root.wait_visibility()。尽管他没有指定他的Python、TCL/TK或TkInter版本,因此可能在他的系统上已经过时了。无论如何,始终包括该命令以实现向后兼容性是一个更安全的选择!


2
我可以确认在Ubuntu 19.10(默认窗口管理器)上仍需要使用root.wait_visibility()才能工作,但是像你所说的,并不需要root参数。 - Daniel Worthington-Bodart
@DanielWorthington-Bodart 感谢您的检查并让大家知道!答案已更新。如果您看到此消息,了解您的Python版本、TCL/TK版本和TkInter(Python模块)版本将会很有帮助。 - Mitch McMabers
请检查这些答案:https://dev59.com/D2jWa4cB1Zd3GeqPu-Xv - Izalion
@Izalion 嗯,那个链接跟透明度完全没关系(这个问题就是关于透明度的)。但还是很好的链接,对于那些想做无边框窗口的人来说。虽然你链接里的人说无边框窗口只能在Mac和Windows上运行。不管怎样,感谢分享一些额外、有用的知识 :-) - Mitch McMabers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接