Tkinter неправильный вывод Label
Писал простенькую программу для составления расписания и задержался на выводе объектов Label LabalFrame создается на втором окне, но когда я пытаюсь создать Label в нем, он создается на 1 окне. Как это исправить?
from tkinter import messagebox
#---------------------------------------Функции кнопок----------------------------------------------
def btn_click():
global sch
number = numberEntry.get()
subject = subjectEntry.get()
output = f'Под номером {number} записан предмет {subject}'
if number == '' and subject != '':
messagebox.showerror(title='Ошибка', message='Вы не ввели номер предмета!')
elif subject == '' and number != '':
messagebox.showerror(title='Ошибка', message='Вы не ввели название предмета!')
elif subject == '' and number == '':
messagebox.showerror(title='Ошибка', message='Вы не ввели номер и название предмета!')
else:
messagebox.showinfo(title='Операция завершена', message=output)
sch[0][int(number)] = subject
def schedule_btn():
global sch
if sch != [['<пусто>'] * 8] * 6:
show_schedule()
else:
messagebox.showerror(title='Ошибка', message='Список предметов пуст!!')
#---------------------------------------Конфиг второго окна----------------------------------------------
def show_schedule():
global sch
Schedule = Toplevel(Main_window)
Schedule.geometry('700x500+200+200')
Schedule.title('Расписание')
monday = LabelFrame(Schedule, bg='gray', text='Понедельник').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
tuesday = LabelFrame(Schedule, bg='gray', text='Вторник').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
wednesday = LabelFrame(Schedule, bg='gray', text='Среда').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
thursday = LabelFrame(Schedule, bg='gray', text='Четверг').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
friday = LabelFrame(Schedule, bg='gray', text='Пятница').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
saturday = LabelFrame(Schedule, bg='gray', text='Суббота').pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][0]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][1]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][2]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][3]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][4]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][5]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][6]}').pack(side=TOP)
Label(monday, width=30, height=2, bg='red', text=f'{sch[0][7]}').pack(side=TOP)
Schedule.mainloop()
#---------------------------------------Списки----------------------------------------------
sch = [['<пусто>'] * 8] * 6
#---------------------------------------Конфиг главного окна----------------------------------------------
Main_window = Tk()
Main_window.geometry('800x600+200+200')
Main_window.title('Составитель расписания')
Label(Main_window, text='Введите номер урока').pack()
numberEntry = Entry(Main_window, bg = 'white')
numberEntry.pack()
Label(Main_window, text='Введите предмет').pack()
subjectEntry = Entry(Main_window, bg = 'white')
subjectEntry.pack()
Button(Main_window, text='Отправить', bg='darkgray', relief=GROOVE, bd=8, command=btn_click).pack()
Button(Main_window, text='Показать текущее расписание', bg='darkgray', relief=GROOVE, bd=8, command=schedule_btn).pack(anchor=SE)
Main_window.mainloop()```
Ответы (1 шт):
Автор решения: Сергей Кох
→ Ссылка
Если вы хотите давать имя создаваемым виджетам и размещать их в одной строке, то это можно сделать применив моржовый оператор:
(monday := LabelFrame(Schedule, bg='gray', text='Понедельник')).pack(ipadx=10, ipady=10, expand=1, fill=BOTH, side=LEFT)
А так как у вас monday is None
, то ткинтер думает, что вы хотите разместить все Label
в окне по умолчанию, то есть в главном. И еще Schedule.mainloop()
не нужен, основной цикл один на всё приложение.