Размеры экрана согласуются с размерами окон в Python tkinter

#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 s

2. Вы прошли root Canvas(...) , но root были уничтожены.

3. Хорошо, но окно s должно открываться ТОЛЬКО при наличии условия elif, поэтому я не знаю, как решить эту проблему…

4. @acw1668 Хорошо, извините, я ошибся только в копировании, когда я вспоминаю s на холсте, однако я получаю ошибку (даже если создается фон без изменения размера): верните self.tk.getint(self.tk.вызов( _tkinter. Ошибка TclError: недопустимое имя команды «.! холст»

5. Я думаю my_canvas , что inside resizer() относится к тому, что создано в root окне, поэтому оно уничтожается вместе с root ним . Обратите внимание, что my_canvas внутри log_ok() находится локальная переменная.