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

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.

  • `不确定这是否适用于Windows.它有效. (4认同)
  • 无论“overrideredirect”调用如何,“窗口闪烁”现象都会发生在我身上。我想这是 `wait_visibility` 的结果,它一直等到窗口变得完全可见,然后才允许添加 `alpha` 属性,从而导致闪烁。 (3认同)
  • 这不适用于linux w/python3-tk 3.4.3 (2认同)
  • @crypdick AFAIK,这在 Tkinter 中是不可能的。wm_attributes('-alpha',0.3) 只在顶层窗口可用,所以透明度只能在顶层添加。 (2认同)

Mit*_*ers 7

截至 2019 年底的摘要:

从 TCL/TK 版本 8.6 开始,alphafullscreentopmostwindow 属性适用于所有平台(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 版本,所以它们在他的系统上可能已经过时了。不管怎样,听起来总是包含该命令以实现向后兼容性是一个更安全的选择!

  • 我可以确认在 Ubuntu 19:10(默认窗口管理器)上您仍然需要 `root.wait_visibility()` 才能工作,但正如您所说,您不需要 root 参数。 (2认同)