Вы можете поместить изображение в Canvas
, а затем поместить в него Button
, поместив его в объект окна Canvas , который может содержать любой виджет Tkinter.
Дополнительные виджеты могут быть добавлены аналогичным образом, каждый внутри своего собственного оконного объекта Canvas
(так как они могут содержать только один виджет каждый). Вы можете обойти это ограничение, поместив виджет Frame
в окно Canvas
, а затем поместив другие виджеты в это .
Вот пример, показывающий, как отобразить один Button
:
from PIL import Image, ImageTk
import tkinter as tk
IMAGE_PATH = 'sfondo.png'
WIDTH, HEIGTH = 200, 200
root = tk.Tk()
root.geometry('{}x{}'.format(WIDTH, HEIGTH))
canvas = tk.Canvas(root, width=WIDTH, height=HEIGTH)
canvas.pack()
img = ImageTk.PhotoImage(Image.open(IMAGE_PATH).resize((WIDTH, HEIGTH), Image.ANTIALIAS))
canvas.background = img # Keep a reference in case this code is put in a function.
bg = canvas.create_image(0, 0, anchor=tk.NW, image=img)
# Put a tkinter widget on the canvas.
button = tk.Button(root, text="Start")
button_window = canvas.create_window(10, 10, anchor=tk.NW, window=button)
root.mainloop()
Снимок экрана:
[1115] [1121 ]
Редактировать
Хотя я не знаю способа сделать это в Frame
вместо Canvas
, вы можете получить свой собственный подкласс Frame
для сделать добавление нескольких виджетов проще. Вот что я имею в виду:
from PIL import Image, ImageTk
import tkinter as tk
class BkgrFrame(tk.Frame):
def __init__(self, parent, file_path, width, height):
super(BkgrFrame, self).__init__(parent, borderwidth=0, highlightthickness=0)
self.canvas = tk.Canvas(self, width=width, height=height)
self.canvas.pack()
pil_img = Image.open(file_path)
self.img = ImageTk.PhotoImage(pil_img.resize((width, height), Image.ANTIALIAS))
self.bg = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img)
def add(self, widget, x, y):
canvas_window = self.canvas.create_window(x, y, anchor=tk.NW, window=widget)
return widget
if __name__ == '__main__':
IMAGE_PATH = 'sfondo.png'
WIDTH, HEIGTH = 350, 200
root = tk.Tk()
root.geometry('{}x{}'.format(WIDTH, HEIGTH))
bkrgframe = BkgrFrame(root, IMAGE_PATH, WIDTH, HEIGTH)
bkrgframe.pack()
# Put some tkinter widgets in the BkgrFrame.
button1 = bkrgframe.add(tk.Button(root, text="Start"), 10, 10)
button2 = bkrgframe.add(tk.Button(root, text="Continue"), 50, 10)
root.mainloop()
Результат:
Насколько я знаю, что нет один от Microsoft (иначе ReaderWriterLockSlim
было бы несколько бессмысленно), и если Вы находите один от третьего лица кроме одного, Вы доверяете, чтобы иметь превосходные умы, кто провел долгое время, думая о, реализовывая и тестируя его, я не доверял бы ему. Я, конечно, не доверял бы случайной реализации CodeProject, например.
У Вас есть какие-либо конкретные меры для предложения того использования ReaderWriterLockSlim
было бы настолько лучше, что стоит искать трудно альтернативы для.NET 2.0? Конечно, "хорошо иметь", но я подозреваю случаи, где это в широком масштабе значительно, относительно редки. Если Вы уже не знаете, что блокировка является узким местом для Вас, я придерживался бы с тем, что Вы имеете и просто готовы обновить, когда Вы можете.
Вы могли бы хотеть попытаться просто использовать нормальные мониторы, а не ReaderWriterLock
хотя - во многих случаях издержки RWL перевешивают преимущество.
Конечно, это - все в зависимости от конкретного случая - Ваше приложение может быть тем, которое действительно было бы сделано очень, намного быстрее ReaderWriterLockSlim
...
Что относительно ReaderWriterGate
из библиотеки PowerThreading?