#python #tkinter #spyder
#python #tkinter #spyder
Вопрос:
Я хочу создать приложение, в котором вы можете изменить фоновое изображение, нажав кнопку. Во-первых, чтобы поместить фон в мой фрейм, я создал изображение как метку, а затем подклассировал все остальные метки в фоновую метку. Теперь, когда вы нажимаете кнопку «Изменить фон», он изменяет фон. Однако все метки исчезают. Кнопки появляются только при наведении на них курсора. Метки никогда не появляются! Мои вопросы:
- Почему это происходит?
- Как это исправить?
Вот простой код для воспроизведения проблемы:
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
.