Я не могу вставить фоновое изображение, сделать полноэкранный режим и закрывать предыдущее окна
Я пишу программу, которая будет работать по алгоритму(то есть при нажатии на какие то кнопки может появиться ещё окно или появиться финальное окно с результатом, а от 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 шт):
Проблема Вашего кода - извините, в полном отсутствии соблюдения хоть какой-то технологии создания простейших интерфейсов, расписанной в каждом школьном учебнике. Я даже не пытался исправлять это код. Его быстрее переписать полностью. Есть серьёзные проблемы с базовыми понятиями, а именно:
- Совать изображения в форму в качестве фоновых просто так не получится, не будет автоподгонки размера как в других языках. Максимизированное окно исключает нормальное размещение какого-либо изображения автоматически. Для этого потребуется сложное программирование.
- Закрывать предыдущие окна можно (например:
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()