Изображение не отображается при использовании его в качестве фона в Tkinter - PullRequest
1 голос
/ 27 февраля 2020

Hy! Я пытаюсь использовать изображение в качестве фона в GUI, созданном в Tkinter. Он отлично работает с тем же кодом в другом кадре в этом проекте, но не хочет работать в другом кадре. Я не получаю ошибки, рамка просто пуста. Спасибо за вашу помощь!

Здесь я могу отлично использовать картинку в качестве фона:

def main_screen():
global screen
screen = Tk()
screen.geometry("600x750")
screen.configure(background="#022140")
screen.title("Hermes")
filename = PhotoImage(file="background.png")
filename_small = filename.subsample(2, 2)
background_label = Label(image=filename_small)
background_label.place(x=1, y=1, relwidth=1, relheight=1)
login_button = Button(text="Login", bg="#022140", height="2", width="30", command=login,
                      highlightbackground='#494B68')
screen.mainloop()

Но здесь она не будет работать:

def login_sucess():
    global screen3
    screen3 = Toplevel(screen)
    screen3.geometry("500x400")
    filename = PhotoImage(file="main_theme.png")
    filename_small = filename.subsample(2, 2)
    background_label = Label(screen3, image=filename_small)
    background_label.place()

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 28 февраля 2020

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

from tkinter import Tk,Label,PhotoImage

root = Tk()
img = PhotoImage(file='background.png')
small_img=img.subsample(2, 2)
background_label = Label(root, image=small_img)
background_label.img=img
background_label.place(x=0, y=0, relheight=1, relwidth=1)
root.mainloop()

Особенно, когда вы создаете Метку, содержащую изображение в области функций или что-то подобное, важно установить эту ссылку, так как переменная для этого экземпляра Labels исчезнет после вызов функции завершается.

PS: Для большей ясности в отношении основных виджетов и небольших улучшений производительности всегда назначайте виджету главный виджет при его инициализации. Я знаю, что tkinter также автоматически назначает последний созданный экземпляр Tk как самого мастера, но а) требует ли это ненужных вычислительных мощностей и б) легче отслеживать, какой виджет является потомком другого, и так далее. ;)

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