Существует ли тонкая блокировка читателя/устройства записи для.NET 2.0?

Вы можете поместить изображение в 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()

Снимок экрана:

screenshot of sample code running [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()

Результат:

screenshot showing two widget displayed on a frame with a background

5
задан dpan 6 April 2009 в 08:19
поделиться

2 ответа

Насколько я знаю, что нет один от Microsoft (иначе ReaderWriterLockSlim было бы несколько бессмысленно), и если Вы находите один от третьего лица кроме одного, Вы доверяете, чтобы иметь превосходные умы, кто провел долгое время, думая о, реализовывая и тестируя его, я не доверял бы ему. Я, конечно, не доверял бы случайной реализации CodeProject, например.

У Вас есть какие-либо конкретные меры для предложения того использования ReaderWriterLockSlim было бы настолько лучше, что стоит искать трудно альтернативы для.NET 2.0? Конечно, "хорошо иметь", но я подозреваю случаи, где это в широком масштабе значительно, относительно редки. Если Вы уже не знаете, что блокировка является узким местом для Вас, я придерживался бы с тем, что Вы имеете и просто готовы обновить, когда Вы можете.

Вы могли бы хотеть попытаться просто использовать нормальные мониторы, а не ReaderWriterLock хотя - во многих случаях издержки RWL перевешивают преимущество.

Конечно, это - все в зависимости от конкретного случая - Ваше приложение может быть тем, которое действительно было бы сделано очень, намного быстрее ReaderWriterLockSlim...

5
ответ дан 14 December 2019 в 13:50
поделиться

Что относительно ReaderWriterGate из библиотеки PowerThreading?

0
ответ дан 14 December 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: