2017-07-08 12 views
0

私はインターフェイスにtkinterを使用するアプリケーションを作成しています インターフェイスには2つのボタンがあり、「計算」と「停止」というボタンがあります。 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

再帰ブロックは、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() 
+0

1つではなく複数の引数を渡す方法はありますか? –

+0

コンマで区切ります。あなたがラムダ関数を参照していると仮定します。したがって、 'root.after(1000、lambda a = args、xy = 'string':Calculate(a、xy)) 'のような2つのパラメータを渡す必要がある場合は、 –

+0

のように動作しますが、この再帰が深いほど、間隔(これは1000であると想定される)が少なくなる。それは間隔がguiブロックよりも小さい深さに達する。 –

関連する問題