Могут быть * параметры, зависящие от платформы, например это . (* В Lubuntu 18.04 и python 3.6.9 они, похоже, не работают, поэтому я не могу их протестировать.)
Один из вариантов кроссплатформенности (?) - использовать Canvas. Затем нарисуйте изображения * на холсте вместо использования виджетов. (* чей альфа-канал определяет их прозрачные пиксели) Это будет правильно рисовать элементы переднего плана / фона, & Canvas имеет достаточно функций для управления элементами на нем (но потребуется работа, если вы хотите эмулировать полные виджеты).
Canvas предлагает различные create_xyz
методы, где xyz: arc
, line
, rectangle
, bitmap
, oval
, text
, image
, polygon
, window
(<- читать "виджет") *. Они возвращают идентификатор, который представляет элемент на холсте. Элементы также могут быть связаны в группы, представленные тегами. </p>
* При использовании виджетов в Canvas существуют некоторые ограничения: https://tcl.tk/man/tcl8.6/TkCmd/canvas.htm#M163 "Примечание: из-за ограничений в способах управления windows, невозможно рисовать другие графические элементы (например, линии и изображения) поверх оконных элементов. Элемент окна всегда скрывает любую графику, которая перекрывает его, независимо от их порядка в списке отображения. "
Элементы на холсте могут быть настроены и иметь обработчики событий: itemconfig
/ itemcget
tag_bind
/ tag_unbind
Они могут использовать либо индивидуальный идентификатор элемента, либо * групповой тег. (* несмотря на 'tag_' в имени, они также принимают идентификаторы элементов)
Многие другие методы Canvas работают с идентификаторами элементов или групповыми тегами (например, move
, delete
,).
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=300)
canvas.pack()
# Note:
# If the images overlap exactly (same position & extent),
# the bottom one will never? get any events.
# Maybe events can be propagated, not sure right now.
fgImg = tk.PhotoImage(master=root, file='media/fg.png')
fgImgId = canvas.create_image(
80, 80, anchor=tk.NW, image=fgImg
)
canvas.tag_bind(
fgImgId,
'<ButtonRelease-1>',
lambda e: canvas.tag_raise(fgImgId)
)
bgImg = tk.PhotoImage(master=root, file='media/bg.png')
bgImgId = canvas.create_image(
0, 0, anchor=tk.NW, image=bgImg
)
canvas.tag_bind(
bgImgId,
'<ButtonRelease-1>',
lambda e: canvas.tag_raise(bgImgId)
)
root.mainloop()
Есть еще вопросы по этому поводу StackOverflow, например: прозрачный-фон-в-окне-a-tkinter python -tkinter-label-background-transparent configure-tkinter-ttk-widgets-with-transparent-background-ttk-frame-background и многое другое.
Возможно, вы также захотите изучить другие gui наборы инструментов. (например, wx python*, pyqt,) (* Здесь говорится, что у него есть команда SetTransparent
.)