python tkinter Toplevel .destroy() vs .quit() не работает должным образом
У меня есть class Duplicates
который проверяет дубликаты в пределах 40 слов.
у меня есть class Window
это создает и запускает главное окно, где я публикую результат.
у меня есть class popWindow
это создает окно Toplevel, когда спрашивает пользователя, что делать с возможным двойным.
Моя проблема заключается в закрытии popWindow
после того, как выбор передан.
у меня есть версия, которая действительно запускается и отправляет aswer (текст с помеченными дубликатами) использует команду quit для закрытия окна (то есть всплывающее окно все еще в пути) или просто для создания нескольких всплывающих окон, пока вы не закончите.
class Duplicates:
def markWord(self):
self.appendMarkedWord(self.word)
self.checked.append(self.word)
self.pop.topLevel_exit()
return ""
class popUpWindow:
temp = Button( self, font = 8,
text = "Allowed this run only",
command = app.newFile.markWord
)
temp.place( x = 178,
y = 55
)
если я вместо этого использую .destroy()
окно закрывается, но программа перестает работать, и это еще хуже.
Как мне обойти это, чтобы он закрывал окно, но продолжал запускать программу?
Хорошо, спустя много часов казалось, что настоящая проблема заключается в том, что destroy() не останавливает мой popUpWindow.mainloop(), поэтому теперь я изменил свой код выхода, чтобы сначала выполнить quit(), а затем - destroy(). Это совсем не то, что я видел в качестве примеров, и мне кажется, что destroy() на mainloop верхнего уровня не завершает его (destroy() отлично работает на моем root.mainloop).
def topLevel_exit(self):
self.pop.quit()
self.pop.destroy()
4 ответа
Если вы позвоните destroy()
в окне верхнего уровня это не остановит запуск приложения. Если ваше приложение останавливается, в вашем коде должно быть больше того, что вы нам рассказываете. Без сомнения, правильный способ избавиться от всплывающего окна - позвонить destroy
по случаю Toplevel
,
Решение для меня было:
def topLevel_exit(self):
self.top.quit()
self.top.destroy()
Я не знаю, является ли это обычной практикой, но это то, что я должен был сделать, так как уничтожение не останавливало мой top.mainloop()
Можно спрятать окно и сохранить работоспособность программы: .withdraw()
на окне, и .reiconify()
чтобы вернуть его (если нужно). Или вы могли бы использовать .destroy()
на Toplevel
окно. Если вам нужны примеры, просто спросите, надеюсь, это поможет вам.
Если вы используете окно верхнего уровня, self.pop.destroy()
должен по-прежнему работать, как вы используете mainloop() В противном случае используйте quit()
или оба, но по моему мнению, я предпочитаю destroy()