Скрипт продолжает работать после destroy () tkinter - PullRequest
0 голосов
/ 25 сентября 2018

Я впервые использую tkinter и создал окно со списком со значениями, которые пользователь может выбрать.Эти значения передаются в функцию, и любой вывод консоли отображается в текстовом поле в окне.

Вот мой код:

class Display(tk.Frame):
    def __init__(self,parent=0):
       tk.Frame.__init__(self,parent)

       # code here that creates a bunch of widgets

       sys.stdout = self

       # code here that packs widgets into frame

    def onSubmit(self):
        self.years = list()
        self.selection = self.lstbox.curselection()
        for i in self.selection:
            entry = self.lstbox.get(i)
            self.years.append(int(entry))
        batch_process(self.years)

    def write(self, txt):
        self.output.insert(tk.END,str(txt))
        self.output.see(tk.END)
        self.update_idletasks()  


class MainW(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self ,parent)
        self.parent = parent
        self.display = Display(self)
        self.display.pack()
        self.title('Test')

        self.protocol('WM_DELETE_WINDOW', self.close_window)

    def close_window(self):
        if messagebox.askokcancel('Exit', 'Are you sure you want to close?'):
            self.destroy()

if __name__=='__main__':
    window = MainW(None)
    window.mainloop()

Окно работает нормально - список успешно передает значенияв функцию и вывод отображается в текстовом поле.

Однако, когда я нажимаю «X» и закрываю окно, консоль показывает, что по какой-то причине скрипт все еще работает.Затем мне нужно полностью закрыть Spyder, чтобы снова запустить скрипт.В чем проблема?Насколько я понимаю, команда destroy () прервала бы mainloop.

EDIT: Если бы кто-то еще запустил скрипт и получил следующую ошибку:

Exception ignored in: <__main__.Display object .!display> 
AttributeError: 'Display' object has no attribute 'flush'

1 Ответ

0 голосов
/ 25 сентября 2018

Я понял ... хотя я не до конца понимаю.Мне пришлось добавить функцию «сброса» в мой класс Display.

def flush(self): 
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...