【问题标题】:Is there a way to create transparent windows with Tkinter?有没有办法用 Tkinter 创建透明窗口?
【发布时间】:2013-08-26 00:27:33
【问题描述】:

最终,我正在尝试使用 Tkinter 模块使用 Python 创建“形状奇特的窗口”。但现在我会满足于让背景透明,同时保持子小部件完全可见。

我知道这是使用 wxPython 和其他一些模块完成的,但我正在询问 Tkinter 的限制。

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

它能否将鼠标单击位置传回系统以处理 Z 堆栈中其下方的任何窗口?

【问题讨论】:

    标签: python user-interface window tkinter transparent


    【解决方案1】:

    选项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。

    【讨论】:

    • 无论overrideredirect 呼叫如何,我都会发生“窗口闪烁”现象。我猜这是wait_visibility 的结果,它一直等到窗口完全可见,然后才允许添加alpha 属性,从而导致闪烁。
    • @tao 这太棒了。有什么办法可以使窗口框架不透明但窗口内容透明?
    • @crypdick AFAIK,这在 Tkinter 中是不可能的。 wm_attributes('-alpha',0.3) 只在顶层窗口可用,所以只能在顶层添加透明度。
    • @martineau:Tkinter 不允许像Frame这样的单个小部件透明
    • @bhaskarc 有没有办法让根透明而不是其中的项目?
    【解决方案2】:

    截至 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 然后立即尝试读取它,您仍然会读取旧值,因此您不能使用该方法检查 alpha 是否在 Linux 上成功更改)。

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

    更新:

    下面 cmets 中的 Daniel 告诉我,root.wait_visibility() 在 Ubuntu 19.10 上仍然是必需的。尽管他没有指定他的 Python、TCL/TK 或 TkInter 版本,所以可能它们在他的系统上已经过时了。无论哪种方式,听起来总是包含该命令以实现向后兼容性是一个更安全的选择!

    【讨论】:

    • 我可以在 Ubuntu 19:10(默认窗口管理器)上确认,您仍然需要 root.wait_visibility() 才能使其工作,但正如您所说,您不需要 root 参数。
    • @DanielWorthington-Bodart 感谢您检查并告知大家!答案已更新。如果你看到这个,了解你的 Python 版本、TCL/TK 版本和 TkInter(python 模块)版本会很有帮助。
    • @Izalion 嗯,该链接与 alpha 透明度完全无关(这个问题是关于这个问题的)。但是,对于那些想要制作无边框窗口的人来说,这仍然是一个很好的链接。尽管您链接中的人说无边框窗口仅适用于 Mac 和 Windows。无论如何,感谢您分享一些额外的有用知识:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2016-03-03
    • 2014-12-31
    • 2021-04-28
    • 2021-02-27
    相关资源
    最近更新 更多