Создание непрозрачного прямоугольника с черным фоном в прозрачном окне верхнего уровня в tkinter

#python #user-interface #tkinter #tk

#python #пользовательский интерфейс #tkinter #tk

Вопрос:

В tkinter можно создать окно верхнего уровня и сделать его прозрачным, используя следующий код:

 self._window = tkinter.Toplevel(self._tk_master)
self._window.wait_visibility()
self._window.wm_attributes('-alpha', 0.4)

self._canvas = tkinter.Canvas(self._window, width=self._width, height=self._height)
self._canvas.pack()
 

Теперь мой вопрос в том, как создать непрозрачный прямоугольник с черным фоном в новом прозрачном окне?

Я попытался просто создать прямоугольник и установить «заливку» на черный, но прямоугольник, похоже, наследует прозрачность окна:

 self._background_rectangle = self._canvas.create_rectangle(
        0,
        0,
        self._width,
        self._height,
        fill="black")
 

Я попытался создать изображение с помощью RGBA и установить прозрачность, но, похоже, это не влияет на отображаемый пользовательский интерфейс:

 alpha = 0.99
fill = tk_master.winfo_rgb(fill)   (int(alpha * 255),)
image_object = PIL.Image.new("RGBA", (width, height), fill)
image_object = PIL.ImageTk.PhotoImage(image_object)
self._canvas.create_image(x, y, image=image_object, anchor=tkinter.NW)
 

Я также взял изображение, содержащее только черный фон, и попытался добавить его, но изображение все равно не отображается!

 image_object = PIL.Image.open(image_with_only_black_background)
image_object.resize((width, height), PIL.Image.ANTIALIAS)
image_object = PIL.ImageTk.PhotoImage(image_object)
self._canvas.create_image(x, y, image=image_object, anchor=tkinter.NW)
 

Кто-нибудь знает, как это решить? Или что я делаю не так?

Спасибо!

Комментарии:

1. Как только окно становится прозрачным, все, что с ним, также alpha применяется.

2. Просто чтобы уточнить, вы создаете окно с прозрачным фоном, и все в окне также должно быть прозрачным?

3. Под прозрачным фоном, если вы имеете в виду использование -alpha , то да. Или, если вы имели в виду использование canvas.create_image() then no, только изображение будет иметь прозрачный фон.

4. Большое вам спасибо!

5. Я бы подождал чужого мнения по этой теме, чтобы быть в безопасности.