我正在制作一个使用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
答案 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()