最终,我正在尝试使用 Tkinter 模块使用 Python 创建“形状奇特的窗口”。但是现在我将满足于使背景透明,同时保持子小部件完全可见。
我知道这是使用 wxPython 和其他一些模块完成的,但我正在询问 Tkinter 的限制。
Tkinter 可以创建清晰的画布或框架吗?它可以在没有画布或框架的情况下打包 UI 元素吗?单个 UI 元素可以透明吗?
它可以将鼠标单击位置传递回系统以处理 Z 堆栈中它下面的任何窗口吗?
最终,我正在尝试使用 Tkinter 模块使用 Python 创建“形状奇特的窗口”。但是现在我将满足于使背景透明,同时保持子小部件完全可见。
我知道这是使用 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
window 属性适用于所有平台(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 然后立即尝试读取它,您仍然会读取旧值,因此您不能使用该方法检查 alpha 是否在 Linux 上成功更改)。
至于其他答案说您首先需要root.wait_visibility(root)
在 Linux 上使用以确保在设置alpha
属性之前窗口在屏幕上可见......我不知道,因为我没有要检查的 Linux 机器。但我严重怀疑它是否不再需要,因为官方手册说支持 alpha 并且没有说明该命令是必要的。无论哪种方式,添加这个技巧也没有什么坏处wait_visibility
......它只是一个运行非常简短的事件循环的命令,该循环等待实际窗口出现在用户屏幕上。因此,在所有属性设置之前添加该命令可能仍然是一个好主意。特别是因为它已被证明有助于在旧TCL/TK 版本的 Linux 上进行 alpha 工作!PS:你没有(root)
参数,并且应该输入root.wait_visibility()
,这意味着“等待self
(在这种情况下是根,因为我们在根对象上调用了命令)”。
Daniel 在下面的评论中让我知道这root.wait_visibility()
在 Ubuntu 19.10 上仍然是必要的。尽管他没有指定他的 Python、TCL/TK 或 TkInter 版本,所以可能它们在他的系统上已经过时了。无论哪种方式,听起来总是包含该命令以实现向后兼容性是一个更安全的选择!