#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
, затем вы можете делать все, что хотите внутри обратного вызова. Если у вас возникли проблемы с этим, лучше создайте другой вопрос.