Pau*_*son 13 python user-interface window tkinter transparent
我最终尝试使用Tkinter模块用Python创建"形状奇特的窗口".但是现在我将满足于能够使背景透明,同时保持儿童小部件完全可见.
我知道这是通过wxPython和其他一些模块完成的,但我正在询问Tkinter的限制.
Tkinter可以创建一个清晰的画布或框架吗?它可以在没有画布或框架的情况下打包UI元素吗?单个UI元素可以透明吗?
它可以将鼠标点击位置传递回系统,以便在Z堆栈中处理它下面的任何窗口吗?
bha*_*arc 18
该选项root.attributes('-alpha', 0.1)可用于制作透明窗口
from Tkinter import *
root = Tk()
root.attributes('-alpha', 0.3)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下,即使root上的小部件也会继承透明度.
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()
Run Code Online (Sandbox Code Playgroud)
不确定这是否适用于Windows.
从 TCL/TK 版本 8.6 开始,alpha、fullscreen和topmostwindow 属性适用于所有平台(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技巧也没什么坏处...它只是一个运行非常简短的事件循环的命令,等待实际的窗口出现在用户的屏幕上。因此,在所有属性设置之前添加该命令可能仍然是一个好主意。特别是因为它被证明可以帮助 alpha 在旧版TCL/TK 版本的 Linux 上工作!PS:您不需要(root)参数,而应该输入root.wait_visibility(),这意味着“等待self(在本例中为 root,因为我们在根对象上调用了命令)”。
Daniel 在下面的评论中让我知道这root.wait_visibility()在 Ubuntu 19.10 上仍然是必要的。尽管他没有指定他的 Python、TCL/TK 或 TkInter 版本,所以它们在他的系统上可能已经过时了。不管怎样,听起来总是包含该命令以实现向后兼容性是一个更安全的选择!