tkinter: процесс уничтожения запускается с `root .after`, когда вызывается` root .destory () `? - PullRequest
0 голосов
/ 03 мая 2020

Я думаю, у меня есть концептуальная проблема. Я хочу запустить процесс с root.after и завершить программу GUI и процесс одновременно. В настоящее время процесс, запущенный с root.after, продолжает выполняться после уничтожения GUI. Как мне нужно сделать это правильно?

MWE: перебрать список и спросить, нужно ли заменить 1 на 0. Программу можно правильно закрыть, нажав exit после замены всех единиц. В противном случае процесс для f продолжится даже после того, как GUI исчезнет:

import tkinter as tk

l = [0,1,1,0,1,0,1]

root = tk.Tk()
var = tk.IntVar()
termination=False

def update_l(i):
    l[i] = 0

def g(i):

    def replace():
        update_l(i)
        b1.destroy()
        b2.destroy()
        var.set(var.get()+1)

    def keep():
        b1.destroy()
        b2.destroy()
        var.set(var.get()+1)

    b1 = tk.Button(root, text='replace', command=replace)
    b1.pack()

    b2 = tk.Button(root, text='keep', command=keep)
    b2.pack()

    root.wait_variable(var)
    f()

def f():
    print(l)
    for i, j in enumerate(l):
        if termination:
            break
        if j:
            g(i)
            break

def terminate():
    global termination
    termination = True
    root.destroy()

b = tk.Button(root, text='exit', command=terminate)
b.pack()

root.after(200, f)
root.mainloop()
...