Есть ли способ создать прозрачные окна с Tkinter?

Я пытаюсь, в конечном счете, создать "необычные окна" с Python, используя модуль Tkinter. Но на данный момент я соглашусь на возможность сделать фон прозрачным, сохраняя при этом дочерние виджеты полностью видимыми.

Я знаю, что это делается с помощью wxPython и некоторых других модулей, но я интересуюсь ограничениями Tkinter.

Может ли Tkinter создать прозрачный холст или рамку? Может ли он упаковывать элементы пользовательского интерфейса без холста или рамки? Могут ли отдельные элементы пользовательского интерфейса быть прозрачными?

Может ли он переместить области щелчка мыши в систему для обработки любых окон под ним в стеке Z?

Ответ 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.

Ответ 2

Сводка по состоянию на конец 2019 года:

Начиная с версии TCL/TK 8.6 атрибуты окна alpha, fullscreen и topmost работают на ВСЕХ платформах (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) атрибуты обновляются асинхронно, что означает, что вы не можете доверять прочитанному значению (если вы измените альфа, а затем сразу попытаетесь прочитать его, вы все равно прочитаете старое значение, поэтому вы не можете использовать этот метод, чтобы проверить, была ли альфа успешно изменена в Linux).

Что касается других ответов, в которых говорится, что сначала вам нужно использовать root.wait_visibility(root) в Linux, чтобы убедиться, что окно видно на экране перед установкой атрибута alpha... Я не знаю, поскольку у меня нет Linux Машину проверять. Но я сильно сомневаюсь, что это нужно больше, так как в официальном руководстве сказано, что alpha поддерживается, и ничего не говорится о необходимости этой команды. В любом случае, добавление трюка wait_visibility тоже не помешает... Это просто команда, которая запускает очень короткий цикл обработки событий, который ждет, пока фактическое окно не появится на экране пользователя. Так что, вероятно, все же стоит добавить эту команду перед всеми настройками атрибутов. Тем более, что он доказал, что альфа работает на Linux на старых версиях TCL/TK! PS: вам не нужен аргумент (root), и вместо этого следует набрать root.wait_visibility(), что означает "ждать self (в данном случае root), так как мы вызвали команду для корневого объекта)".