让用户强制停止循环

时间:2017-07-08 19:02:43

标签: python-3.x tkinter

我正在制作一个使用tkinter进行界面的应用 界面有两个按钮,一个显示'calculate',另一个显示'stop'。 Calculate按钮触发一个calculate(),它对自身进行递归调用,这使得它成为无限循环或非常深的循环。我希望用户能够使计算停止,然后按下“停止”按钮。

def init():
    btnCalculate = Button(myframe, text="Caculate", command= Calculate, width=10)
    btnStop = Button(myframe, text="Stop", command= Stop, width=10)
    btnCalculate.place(x=0, y=0)
    btnStop.place(x=100, y=0)

def Calculate():
    Calculate(para)

def Calculate(para):
    # do some stuff
    # check condition
    if condition:
        Calculate(para)

def Stop():
    return

1 个答案:

答案 0 :(得分:1)

递归阻止GUI必须用于执行其工作的事件循环。所以这里是对你所拥有的使用事件调度来做你想做的事的修改。为了模拟递归,我反复在事件堆栈上调用Calculate方法进行处理。您可以将频率从1000(毫秒)更改为您需要的任何频率。

from tkinter import *

stop = False

def init():
    btnCalculate = Button(myframe, text="Calculate", command=Calculate, width=10)
    btnStop = Button(myframe, text="Stop", command= Stop, width=10)
    btnCalculate.pack()
    btnStop.pack()

#def Calculate():
#    Calculate(para)

def Calculate(*args):
    global stop
    # do some stuff
    # check condition
    if not stop:
        print("Calculating...")
        root.after(1000, lambda a=args: Calculate(a))

def Stop():
    global stop
    print('Stopping')
    stop = True

root = Tk()
myframe = Frame(root)
myframe.pack()
init()
root.mainloop()