не может закрыть окно верхнего уровня tkinter - PullRequest
0 голосов
/ 19 июня 2020

Я пишу небольшой код для сортировки инструментов, и я создал настраиваемое диалоговое окно, в котором пользователь будет выбирать условие для инструмента, однако, когда я пытаюсь закрыть окно, он просто создает еще один пустой верхний уровень окно. что я делаю не так?

def tool_condition_message(tool_ID):
    condition_win = Toplevel()
    condition_win.title('Condition')
    message = "What is the condition of " + tool_ID + " ?"
    Label(condition_win, text=message).pack()
    new = Button(condition_win, text='New', command=lambda:condition(4))
    new.pack(side=LEFT)
    good = Button(condition_win, text='Good', command=lambda:condition(3))
    good.pack(side=LEFT)
    fair = Button(condition_win, text='Fair', command=lambda:condition(2))
    fair.pack(side=LEFT)
    poor = Button(condition_win, text='Poor', command=lambda:condition(1))
    poor.pack(side=LEFT)

    return 0



def condition(value):
    global item_condition
    item_condition = value
    print(item_condition)
    destroy(Toplevel())

1 Ответ

0 голосов
/ 19 июня 2020

2 проблемы с этим фрагментом кода - destroy(TopLevel()):

  1. destroy не является встроенной функцией python, поэтому ее нельзя использовать таким образом. Правильный способ: {tkinter_widget}.destroy()
  2. TopLevel() будет создавать новый виджет верхнего уровня (он же окно приложения), поэтому вы не будете уничтожать тот, который уже существует, в любом случае . Вместо этого вам нужно уничтожить экземпляр существующего окна.

Чтобы это работало, необходимо внести несколько изменений:

# Pass the condition_win into the new condition function
new = Button(condition_win, text='New', command=lambda:condition(condition_win, 4))
good = Button(condition_win, text='Good', command=lambda:condition(condition_win, 3))
...

# Change condition to accept the existing window as well
def condition(condition_win, value):
    ...
    condition_win.destroy()
...