Рамка без фона в tkinter - PullRequest
1 голос
/ 12 июля 2020

У меня есть холст с фоновым изображением в Tkinter. Я хочу добавить рамку без фона, чтобы я мог расположить элементы в окне, но при этом все еще видеть фон позади этих элементов. Когда я использую что-то похожее на код ниже, то есть без указания цвета bg, я получаю рамку с серым фоном. Как вообще отключить фон?

import tkinter as tk
from PIL import Image,ImageTk

root=tk.Tk()
root.geometry("800x560")

bgImg=Image.open("data/bg.png")
bgImg=ImageTk.PhotoImage(bgImg)
canvas=tk.Canvas(root,width=800,height=560)
canvas.pack(expand = False, fill = "both")

canvas.create_image(0, 0, image=bgImg, anchor="nw")

frame=tk.Frame(canvas,width=50,height=50)
frame.place(relx=0.5,rely=0.5,anchor="center")

root.mainloop()

1 Ответ

0 голосов
/ 13 августа 2020

Могут быть * параметры, зависящие от платформы, например это . (* В 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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...