Я не могу вставить фоновое изображение, сделать полноэкранный режим и закрывать предыдущее окна

Я пишу программу, которая будет работать по алгоритму(то есть при нажатии на какие то кнопки может появиться ещё окно или появиться финальное окно с результатом, а от Toplevel(opennewwindow(1)) при нажатии на кнопок должно появиться ещё окно) я написал основной код этой программы, но у меня не получилось вставить фоновое изображение на все окна, а также сделать полноэкранный режим для всех окон и закрывать предыдущие окна. Вот код(версия питона - 3.10)

from tkinter import * #Выводит библиотеку окон
from tkinter.ttk import * #Выводит библиотеку дополнительных окон

master = Tk()#Названии опции
master.geometry("1920x1080")#Размер окна
master.title("Окно")#Названия окна\

bg=PhotoImage("C:/Users/User/AppData/Local/Programs/Python/Python310/draw.jpg") 


def openNewWindow():#Опция нового окна
        newWindow = Toplevel(master)##Названии опции нового окна
        newWindow.title("Второе окно")#Названия окна нового окна
        newWindow.geometry('1920x1080')#Размер окна нового окна
        Label(newWindow, #Начало титульного вопроса нового окна
            text ="Вопрос №2").pack()# Конец  титульного вопроса нового окна

        btn = Button(newWindow,#Начало кнопки нового окна
                         text ="Да",#середина кнопки нового окна
                         command = openNewWindow)#Конец кнопки нового окна
        btn.pack(pady = 10)#Оформление кнопки нового окна
        btn = Button(newWindow,##Начало второй кнопки нового окна
                         text ="нет",#середина второй кнопки нового окна
                         command = openNewWindow1)#Конец второй кнопки нового окна
        btn.pack(pady = 10)#Оформление второй кнопки нового окна
        master.withdraw()
        openNewWindow1.withdraw()

def openNewWindow1():##Опция нового dd второго окна
        newWindow1 = Toplevel(master)###Названии опции нового окна
        newWindow1.title("Третье окно")##Названия окна нового окна
        newWindow1.geometry('1920x1080')##Размер окна нового окна
        Label(newWindow1, ##Начало титульного вопроса нового окна
            text ="Вопрос №3").pack()## Конец  титульного вопроса нового окна

        btn = Button(newWindow1,##Начало кнопки нового окна
                         text ="Да",##середина кнопки нового окна
                         command = openNewWindow)##середина кнопки нового окна#Конец кнопки нового окна
        btn.pack(pady = 10)##Оформление кнопки нового окна
        btn = Button(newWindow1,###Начало второй кнопки нового окна
                         text ="нет",##середина второй кнопки нового окна
                         command = openNewWindow2)##Конец второй кнопки нового окна
        btn.pack(pady = 10)##Оформление второй кнопки нового окна
        master.withdraw()
        openNewWindow.withdraw()

def openNewWindow2():##Опция нового dd третьего окна
        newWindow2 = Toplevel(master)###Названии опции нового третьего  окна
        newWindow2.title("Третье окно")##Названия окна нового третьего  окна
        newWindow2.geometry('1920x1080')##Размер окна нового третьего  окна
        Label(newWindow2, ##Начало титульного вопроса нового третьего  окна
            text ="Вопрос №4").pack()## Конец  титульного вопроса нового третьего  окна

        btn = Button(newWindow2,##Начало кнопки нового третьего  окна
                         text ="Да",##середина кнопки нового третьего  окна
                         command = openNewWindow)##середина кнопки третьего  нового окна#Конец кнопки нового третьего  окна
        btn.pack(pady = 10)##Оформление кнопки нового третьего  окна
        btn = Button(newWindow2,###Начало второй кнопки нового третьего  окна
                         text ="нет",##середина второй кнопки нового третьего  окна
                         command = openNewWindow1)##Конец второй кнопки нового третьего  окна
        btn.pack(pady = 10)##Оформление второй кнопки нового третьего   окна
        master.withdraw()
        openNewWindow.withdraw()




background = PhotoImage()
label = Label(master, image=bg, #Вопрос основного окна(начало)
              text ="Вопрос №1")##Вопрос основного окна(середина)
label.place(x=0, y=0)
label.pack(pady = 10)##Оформление основного окна(оформление)


btn = Button(master, ##Кнопка основного окна(начало)
                text ="Да", ##Кнопка основного окна(середина)
                command = openNewWindow)##Кнопка основного окна(середина)
btn.pack(pady = 10)##Оформление основного окна(начало)

btn = Button(master, ##Кнопка основного окна(начало)
                text ="Нет", ##Кнопка основного окна(середина)
                command = openNewWindow1)##Кнопка основного окна(середина)
btn.pack(pady = 10)##Оформление основного окна(начало)




btn.pack(pady = 10)#
mainloop()#Конец цикла и запуск команды

Когда я нажимаю на кнопки в программе, появляется вот такая ошибка, и в первом окне исчезает текст, и не появляется фоновое изображение:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 27, in openNewWindow
    openNewWindow1.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 27, in openNewWindow
    openNewWindow1.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 45, in openNewWindow1
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 63, in openNewWindow2
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 45, in openNewWindow1
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'

Ответы (1 шт):

Автор решения: Fox Fox

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

  • Совать изображения в форму в качестве фоновых просто так не получится, не будет автоподгонки размера как в других языках. Максимизированное окно исключает нормальное размещение какого-либо изображения автоматически. Для этого потребуется сложное программирование.
  • Закрывать предыдущие окна можно (например: second_window.destroy()), но нельзя при этом закрывать главное окно. Это вообще не обязательно на самом деле в этой ситуации - см. использование grab_set().
  • Полноэкранный режим для окна устанавливается вот так, например: third_window.state('zoomed').
  • Дочерние окна должны быть дочерними по отношению к главному окну, но не друг к другу. Это обеспечивается опцией: tk.Toplevel(root). Только тогда следующее дочернее окно может удалять предыдущее - то, из которого оно запускалось.

Я предлагаю Вам именно примитивное, именно школьное, именно обучающее, именно демонстрационное приложеньице, написанное специально для Вашего вопроса. Его задача - не великозаумное исполнение великозаумного кода, а демонстрация базовых понятий програмирования простейших графических интерфейсов на уровне школы. В процессе исполнения кода будет сформировано максимизированное главное окно с изображением и кнопкой и два максимизированных дочерних окна, с изображениями и кнопкой во втором окне для создания третьего окна. Когда загружается третье окно, второе закрывается. 001.jpg, 002.jpg, 003.jpg надо положить в каталог со скриптом для того, чтоб он сработал.

import tkinter as tk
from PIL import Image, ImageTk

def open_second_window():
    # Создаем второе дочернее окно
    second_window = tk.Toplevel(root)
    second_window.title("Второе окно")
    second_window.state('zoomed')

    # Загружаем изображение 002.jpg
    image_path = "002.jpg"
    image = Image.open(image_path)
    photo = ImageTk.PhotoImage(image)

    # Создаем метку для отображения изображения
    label = tk.Label(second_window, image=photo)
    label.image = photo  # Сохраняем ссылку на изображение
    label.pack(fill=tk.BOTH, expand=True)

    # Создаем кнопку "Далее"
    button = tk.Button(second_window, text="Далее", command=lambda: open_third_window(second_window))
    button.place(relx=1.0, rely=0.0, anchor='ne')

    # Устанавливаем режим grab_set()
    second_window.grab_set()

def open_third_window(second_window):
    # Закрываем второе окно
    second_window.destroy()

    # Создаем третье дочернее окно
    third_window = tk.Toplevel(root)
    third_window.title("Третье окно")
    third_window.state('zoomed')

    # Загружаем изображение 003.jpg
    image_path = "003.jpg"
    image = Image.open(image_path)
    photo = ImageTk.PhotoImage(image)

    # Создаем метку для отображения изображения
    label = tk.Label(third_window, image=photo)
    label.image = photo  # Сохраняем ссылку на изображение
    label.pack(fill=tk.BOTH, expand=True)

    # Устанавливаем режим grab_set()
    third_window.grab_set()

# Создаем главное окно
root = tk.Tk()
root.title("Главное окно")
root.state('zoomed')

# Загружаем изображение 001.jpg
image_path = "001.jpg"
image = Image.open(image_path)
photo = ImageTk.PhotoImage(image)

# Создаем метку для отображения изображения
label = tk.Label(root, image=photo)
label.pack(fill=tk.BOTH, expand=True)

# Создаем кнопку "Далее"
button = tk.Button(root, text="Далее", command=lambda: open_second_window())
button.place(relx=1.0, rely=0.0, anchor='ne')

# Запускаем главный цикл
root.mainloop()
→ Ссылка