Python 3.x 让用户强制停止循环
我正在制作一个使用tkinter作为界面的应用程序 该界面有两个按钮,一个显示“计算”,另一个显示“停止”。 Calculate按钮触发一个Calculate,该Calculate本身有一个递归调用,这使得它要么是一个无限循环,要么是一个非常深的循环。我希望用户能够通过“停止”按钮使计算停止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
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。随之而来的还有一点额外的复杂性: