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

时间:2013-08-23 04:14:37

标签: python user-interface window tkinter transparent

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

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

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

它可以将鼠标点击位置传递回系统,以便处理Z堆栈中它下面的任何窗口吗?

2 个答案:

答案 0 :(得分:16)

选项root.attributes('-alpha', 0.1)可用于制作透明窗口

from Tkinter import *
root = Tk()
root.attributes('-alpha', 0.3)
root.mainloop()

但是在这种情况下,即使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()

不确定这是否适用于Windows。

答案 1 :(得分:0)

截至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上,有很多不同的窗口管理器/合成器,而NOT全部支持透明窗口等)。它表示如果不支持透明性,则如果您稍后尝试再次读取,则alpha属性将保留在1.0处。但是该页面还指出,在Linux(X11)上,属性是异步更新的,这意味着您无法信任所读取的值(如果您更改了alpha,然后立即尝试读取它,那么您仍然会读取旧值,因此您不能使用该方法来检查Alpha是否已在Linux上成功更改)。

关于其他回答,说您首先需要在Linux上使用root.wait_visibility(root)来确保在设置alpha属性之前该窗口在屏幕上可见...我不知道,因为我没有要检查的Linux机器。但是我对此表示非常怀疑,因为官方手册中说支持alpha,并且对该命令没有任何要求。无论哪种方式,都不会增加wait_visibility技巧……这只是运行非常简短的事件循环的命令,该循环等待直到实际窗口出现在用户的屏幕上。因此,在所有属性设置之前添加该命令可能仍然是一个好主意。特别是因为它已经得到 proved 的帮助,可以帮助Alpha在 TCL / TK版本的Linux上运行! PS:您不需要(root)参数,而应键入root.wait_visibility(),这意味着“等待self(在这种情况下为root,因为我们在根对象)”。