#python #tkinter #python-idle
Вопрос:
У меня проблема с настройкой экрана в Python Tkinter. Мне нужны обои, совместимые с размером окна, в котором я его открываю. Я сделал эту функцию:
def resizer(e):
global bg1, resized_bg, new_bg
bg1 = Image.open("WUT_banner_Automotive_1080x335.4532699.png")
resized_bg = bg1.resize((e.width, e.height), Image.ANTIALIAS)
new_bg = ImageTk.PhotoImage(resized_bg)
my_canvas.create_image(0,0, image=new_bg, anchor="nw")
Он хорошо работает, когда я вызываю его в «главном», но когда я вызываю его в другой функции, он не работает:
def log_ok():
user = e1.get()
password = e2.get()
if(user == "" and password == ""):
messagebox.showinfo("", "Inserisci le credenziali per accedere.")
elif(user == "admin" and password == "admin"):
messagebox.showinfo("", "Login success.")
root.destroy()
s = Tk()
s.title("Service window")
s.geometry("700x400")
bg = ImageTk.PhotoImage(file="WUT_banner_Automotive_1080x335.4532699.png")
my_canvas = Canvas(s, width = 700, heigh =335)
my_canvas.pack(fill="both", expand=True)
my_canvas.create_image(0,0, image=bg, anchor="nw")
Button(s, text="Diagnostic request", command = lambda: [ s.destroy(),open_window() ] , heigh = 3, width = 13).place(x=10, y=100)
.bind('<Configure>', resizer)
s.mainloop()
else:
messagebox.showerror("", "Incorrect Username and Password")`
В частности, я получаю эту ошибку:
введите описание изображения здесь
Не могли бы вы любезно сказать мне, где я ошибаюсь? Я не вижу ошибки, и я почти два дня ломал голову над тем, как сделать обои подходящими для окна, но в другой функции. Любая помощь будет оценена по достоинству.
Комментарии:
1. Если у вас несколько экземпляров
Tk()
, вам необходимо передать главный параметр при созданииImageTk.PhotoImage
. Поэтому вам нужно добавитьmaster = my_canvas
new_bg = ImageTk.PhotoImage(resized_bg)
и что-то подобное для всех ваших другихImageTk.PhotoImage
s2. Вы прошли
root
Canvas(...)
, ноroot
были уничтожены.3. Хорошо, но окно s должно открываться ТОЛЬКО при наличии условия elif, поэтому я не знаю, как решить эту проблему…
4. @acw1668 Хорошо, извините, я ошибся только в копировании, когда я вспоминаю s на холсте, однако я получаю ошибку (даже если создается фон без изменения размера): верните self.tk.getint(self.tk.вызов( _tkinter. Ошибка TclError: недопустимое имя команды «.! холст»
5. Я думаю
my_canvas
, что insideresizer()
относится к тому, что создано вroot
окне, поэтому оно уничтожается вместе сroot
ним . Обратите внимание, чтоmy_canvas
внутриlog_ok()
находится локальная переменная.