Python 3.x 让用户强制停止循环

Python 3.x 让用户强制停止循环,python-3.x,tkinter,Python 3.x,Tkinter,我正在制作一个使用tkinter作为界面的应用程序 该界面有两个按钮,一个显示“计算”,另一个显示“停止”。 Calculate按钮触发一个Calculate,该Calculate本身有一个递归调用,这使得它要么是一个无限循环,要么是一个非常深的循环。我希望用户能够通过“停止”按钮使计算停止 def init(): btnCalculate = Button(myframe, text="Caculate", command= Calculate, width=10) btnSt

我正在制作一个使用tkinter作为界面的应用程序 该界面有两个按钮,一个显示“计算”,另一个显示“停止”。 Calculate按钮触发一个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

递归阻止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()

如何传递多个参数而不是一个参数?用逗号分隔。假设您指的是lambda函数。因此,如果您需要传递两个参数:root.after1000,lambda a=args,xy='string':Calculatea,xy这种方法有效,但是,递归越深入,应该为1000的间隔减少的越少。它到达的深度是如此之小以至于gui阻塞。不确定gui阻塞是什么意思。您是否在减少after语句中的毫秒延迟?GUI不会阻塞。实际情况是,计算需要花费任何时间,然后偶数循环将计算重新安排为在未来延迟毫秒。因此,如果您需要更高的性能,您可能会考虑将所有这些转换为多处理,以利用计算机上的多个CPU。随之而来的还有一点额外的复杂性: