1

「開始」ボタンが押されたときに繰り返し作業を開始し、「停止」ボタンが押されたときに進行中のループを中断できる tkinter インターフェイスを構築したいと考えています。ただし、進行中のループが終了するまで、tkinter はそれ以上のジョブを処理しないことに気付きました (たとえば、「停止」ボタンのクリックに応答せず、添付のコードに示すようにテキスト ボックスまたはラベル テキストを更新しません)。stackoverflow で読んだことから、tkinter のシングルスレッドの性質に関連しているようです。誰かが特定のコードを手伝ってくれますか? 私は tkinter/Python を初めて使用します。ボード上の多くの一般的な議論を読みましたが、実際の解決策を見つけることができませんでした。

import time
import Tkinter as Tk

def _start():
    for outer in range(5):
        if active_stat:
            time.sleep(1) # some code in the real app
        else:
            break
        for inner in range(5):
            if active_stat:
                #counterstr.set("%02d-%02d" % (outer,inner)) #does not update till the end of loop
                textbox.insert(Tk.END, "%02d-%02d\n" % (outer,inner)) #does not show till the end of loop
                print "%02d-%02d" % (outer,inner)
                time.sleep(1) #some code in the real app
            else:
                break

def _stop():
    active_stat=False

active_stat=True

root = Tk.Tk()

#counterstr=Tk.StringVar() 
#Tk.Label(root, textvariable=counterstr).pack(side=Tk.TOP)
textbox=Tk.Text(root) 
textbox.pack(side=Tk.TOP) 
Tk.Button(root, text='Start', command=_start).pack(side=Tk.LEFT)
Tk.Button(root, text='Stop', command=_stop).pack(side=Tk.LEFT)
Tk.Button(root, text='Quit', command=root.quit).pack(side=Tk.LEFT)
root.mainloop()
4

1 に答える 1

0

私がすることは、あなたactive_statを tkinter 変数にして、それgetをチェックしたいときはいつでもそのメソッドを呼び出すことです:

root.update()編集:また、ループに追加します。これで問題が解決するはずです。tkinter 変数の理由は、変数のスコープの問題によるものです。最初はどこに問題がありましたか。(注: このコードは python 3 用です...)

import time
import tkinter as Tk

def _start():
    for outer in range(5):
        if active_stat.get():
            time.sleep(1) # some code in the real app
        else:
            active_stat.set(True)
            break
        for inner in range(5):
            if active_stat.get():
                #counterstr.set("%02d-%02d" % (outer,inner)) #does not update till the end of loop
                textbox.insert(Tk.END, "%02d-%02d\n" % (outer,inner)) #does not show till the end of loop
                print ("{}-{}".format(outer,inner))
                time.sleep(1) #some code in the real app
            else:
                active_stat.set(True)
                break
            root.update()

def _stop():
    active_stat.set(False)


root = Tk.Tk()

active_stat = Tk.BooleanVar(root)
active_stat.set(True)

#counterstr=Tk.StringVar() 
#Tk.Label(root, textvariable=counterstr).pack(side=Tk.TOP)
textbox=Tk.Text(root) 
textbox.pack(side=Tk.TOP) 
Tk.Button(root, text='Start', command=_start).pack(side=Tk.LEFT)
Tk.Button(root, text='Stop', command=_stop).pack(side=Tk.LEFT)
Tk.Button(root, text='Quit', command=root.quit).pack(side=Tk.LEFT)
root.mainloop()
于 2013-08-03T13:13:32.510 に答える