2014-09-28 7 views
-1

У меня есть class Duplicates, который проверяет наличие дубликатов в 40 словах.python tkinter Toplevel .destroy() vs .quit() не работает по назначению

У меня есть 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() на topplevel mainloop не заканчивает его (destroy() отлично работает на моем root.mainloop).

def topLevel_exit(self): 
    self.pop.quit() 
    self.pop.destroy() 

ответ

2

Если вы вызываете destroy() в окне верхнего уровня, это не остановит запуск приложения. Если ваше приложение останавливается, для вашего кода должно быть больше того, что вы нам рассказываете. Несомненно, правильный способ избавиться от всплывающего окна - позвонить destroy по экземпляру Toplevel.

+0

я запустить приложение с сделать мое окно CLA ss, и оттуда я делаю объект Duplicates или, если быть более точным, у меня есть None в __init__, но он создается при нажатии кнопки new file. Я создаю экземпляр popwindow внутри Duplicates, поэтому я не понимаю, почему это перехватило основное окно. Я с тех пор пытался использовать popWindow как метод внутри окна, и он все равно отключается, как только я уничтожаю popwindow. Должно быть, я не понимаю ни tkinter, ни потоки python, ни то и другое. – enno4859

+0

@ enno4859: Вы используете потоки? Вы звоните в mainloop более одного раза? Это будут важные детали, которые вы оставили вне своего вопроса. –

+0

да второй главный овер для верхнего окна, так что он будет ждать ввода от пользователя. – enno4859

0

способ скрыть окно и сохранить запущенная программа будет использовать .withdraw() на окне, и .reiconify(), чтобы получить его обратно (в случае необходимости). Или вы можете использовать .destroy() на окне Toplevel. Если вам нужны примеры, просто спросите, надеюсь, это вам поможет.

0

Решение для меня было:

def topLevel_exit(self): 
    self.top.quit() 
    self.top.destroy() 

Я не знаю, если это общие праксис, но это то, что я должен был сделать, так как уничтожить не останавливая мой top.mainloop()

+0

То, что вы говорите, не имеет большого смысла. Вы правы, что 'destroy()' не остановит mainluop. Вы никогда не хотите останавливать mainloop, пока ваша программа не выйдет. Вы управляете более чем одним mainloop? Возможно, это настоящий корень вашей проблемы. –

+0

yes a top.mainloop для верхнего окна. Если у меня нет mainloop, он не будет ждать ввода от пользователя. – enno4859

0

Если вы использовать окно верхнего уровня, self.pop.destroy() должен работать, как вы используете MainLoop() в противном случае используйте quit() или оба, но по моему мнению все это, я предпочитаю destroy()

Смежные вопросы