Изменение фона приводит к исчезновению его меток

#python #tkinter #spyder

#python #tkinter #spyder

Вопрос:

Я хочу создать приложение, в котором вы можете изменить фоновое изображение, нажав кнопку. Во-первых, чтобы поместить фон в мой фрейм, я создал изображение как метку, а затем подклассировал все остальные метки в фоновую метку. Теперь, когда вы нажимаете кнопку «Изменить фон», он изменяет фон. Однако все метки исчезают. Кнопки появляются только при наведении на них курсора. Метки никогда не появляются! Мои вопросы:

  1. Почему это происходит?
  2. Как это исправить?

Вот простой код для воспроизведения проблемы:

 import tkinter as tk
from PIL import ImageTk, Image

class App():
    def __init__(self, root):
        self.root = root
        
        self.controlFrame = tk.Frame(root, width=900, height=600)
        self.controlFrame.pack_propagate(0)   # Prevents resizing
        self.controlFrame.pack()
        
        
        
        img = Image.open('images/outside.jpg').resize((900, 600))
        self.background_image = ImageTk.PhotoImage(img)        
        self.background_label = tk.Label(self.controlFrame, image=self.background_image)
        self.background_label.configure(image = self.background_image)
        self.background_label.pack(fill="both", expand="yes")
        
        
        
        self.changeButton = tk.Button(self.background_label, text="Change Background", 
                                    command = self.changeBK)
        self.changeButton.place(x=400, y=300)
        
        self.someButton = tk.Button(self.background_label, text="Some Button")                                    
        self.someButton.place(x=400, y=100)
        
        self.someOtherButton = tk.Button(self.background_label, text="Some Other Button")
        self.someOtherButton.place(x=400, y=450)
        
        self.userMessage = tk.Label(self.background_label, text="Label", height = 3 , width= 14, bg="white")
        self.userMessage.place(x=400, y= 200)
        
    def changeBK(self):
        img = Image.open('images/muddyPath.jpg').resize((900, 600))
        self.background_image = ImageTk.PhotoImage(img)
        self.background_label.configure(image = self.background_image)

def main():
    win = tk.Tk()                           # Create a window
    win.title("Using Multiple Layouts")     # Set window title
    win.geometry("900x600")                 # Set window size
    win.resizable(False, False)             # Both x and y dimensions ...

    # Create the GUI as a Frame
    # and attach it to the window ...
    myApp = App(win)

    # Call the GUI mainloop ...
    win.mainloop()

if __name__ == "__main__":
    main()
 

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

1. A Label не предназначен как контейнер для других виджетов. Вместо этого используйте в self.controlFrame качестве родительского элемента для этих кнопок и меток.

2. @acw1668 Я хочу иметь self.background_image в качестве фона фрейм, и я не знаю других способов сделать это, кроме как поместить все в эту метку изображения.

3. Вы пробовали предложение в моем комментарии?

4. @acw1668 уже сделал, да. Если self.controlFrame является родительским как для кнопок, так и для изображения, то, насколько мне известно, я не могу иметь изображение за кнопками, как я хочу.

5. Я протестировал ваш код, и он отлично работает, если просто изменить родительский элемент кнопок и меток с self.background_label на self.controlFrame .