Средство изменения размера фона TKinter кнопки / метки

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я пытаюсь настроить графический интерфейс tkinter с фоновыми обоями, когда изображение bg соответствует размеру экрана, я взял код отсюда .. но проблема в том, что когда я пытаюсь разместить на нем кнопки или другие метки, обои по-прежнему остаются сверху, и я их не вижу.

Вот код:

 from tkinter import *
from PIL import Image, ImageTk

root = Tk()
root.title("Title")
root.geometry("800x600")

class Example(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.configure(background="black")
        self.grid(sticky=N S E W)
        self.image = Image.open("bg.jpg")
        self.img_copy= self.image.copy()
        self.background_image = ImageTk.PhotoImage(self.image)

        self.background = Label(self, image=self.background_image)
        self.background.grid(row =0, column =0,sticky="nsew")
        self.background.grid_rowconfigure(0, weight=1)
        self.background.grid_columnconfigure(0, weight=1)

        self.master = master
        self.master.bind('<Configure>', self._resize_image)

        # create a button
        self.button= Button(root, text="EXIT", width=4).grid(row=3, column=1, sticky=N S E W)

    def _resize_image(self,event):
        new_width = self.master.winfo_width()
        new_height = self.master.winfo_height()

        self.image = self.img_copy.resize((new_width, new_height))

        self.background_image = ImageTk.PhotoImage(self.image)
        self.background.configure(image =  self.background_image)

e = Example(root)
e.grid(row =0, column =0,sticky="nsew")
e.grid_rowconfigure(0, weight=1)
e.grid_columnconfigure(0, weight=1)

root.mainloop()
  

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

1. Вы должны использовать place() для фонового изображения. Также где находится кнопка, которую нужно добавить? root или self ?

2. Спасибо за помощь! мне нужно добавить кнопки над изображением, на самом деле не менять, где .. как вы это делаете с помощью place ()?

Ответ №1:

Вам нужно использовать place() для размещения фонового изображения, чтобы оно не мешало другим виджетам в том же родительском.

Ниже приведен упрощенный пример, основанный на вашем коде:

 from tkinter import *
from PIL import Image, ImageTk

class Example(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.configure(background="black")

        self.image = Image.open("bg.jpg")

        # label for the background image
        self.background = Label(self)
        self.background.place(x=0, y=0)

        self.bind('<Configure>', self._resize_image)

        # create a button
        self.button = Button(self, text="EXIT", width=4)
        self.button.grid(row=3, column=1, sticky=N S E W, padx=50, pady=50)

    def _resize_image(self,event):
        if event.widget is self:
            # resize background image to fit the frame size
            image = self.image.resize((event.width, event.height))
            self.background_image = ImageTk.PhotoImage(image)
            self.background.configure(image=self.background_image)

root = Tk()
root.title("Title")
root.geometry("800x600")

e = Example(root)
e.pack(fill=BOTH, expand=1)

root.mainloop()
  

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

1. Спасибо за помощь! вы решили мою проблему, но теперь, если я хочу добавить больше кнопок, когда каждая из них открывает другое окно с другими параметрами, как я могу это сделать?

2. Вы можете назначить обратный вызов с помощью command опции Button , затем вы можете делать все, что хотите внутри обратного вызова. Если у вас возникли проблемы с этим, лучше создайте другой вопрос.