我试图使用Python中的Tkinter模块创建“奇形怪状的窗口”。但现在,我只想让背景透明,同时保持子部件完全可见。
我知道可以使用wxPython和其他一些模块来实现这一点,但我想了解一下Tkinter的限制。
Tkinter能否创建一个透明的画布或框架?它可以在没有画布或框架的情况下打包UI元素吗?单个UI元素能否透明?
它能否将鼠标点击位置传递回系统,以便处理位于它下面的任何窗口的Z堆栈?
我试图使用Python中的Tkinter模块创建“奇形怪状的窗口”。但现在,我只想让背景透明,同时保持子部件完全可见。
我知道可以使用wxPython和其他一些模块来实现这一点,但我想了解一下Tkinter的限制。
Tkinter能否创建一个透明的画布或框架?它可以在没有画布或框架的情况下打包UI元素吗?单个UI元素能否透明?
它能否将鼠标点击位置传递回系统,以便处理位于它下面的任何窗口的Z堆栈?
选项 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 操作系统。
从TCL/TK 8.6版本开始,alpha
,fullscreen
和topmost
窗口属性在所有平台(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版本,因此可能在他的系统上已经过时了。无论如何,始终包括该命令以实现向后兼容性是一个更安全的选择!
root.wait_visibility()
才能工作,但是像你所说的,并不需要root
参数。 - Daniel Worthington-Bodart