プログラムを実行すると、PythonGUIがフリーズします。これが私のメインコードです。スレッド化の手助けをしてもらえますか?したがって、実行はバックグラウンドで行われ、実行を終了したい場合でもGUIの「x」ボタンを使用できますか?現在、プログラムを終了するためにcmdを閉じるようにユーザーに依頼しています。
if __name__ == "__main__":
root = Tk()
root.title('Log')
root.geometry("400x220")
font1=('times', 15)
font2=('times', 10)
#Label inside root
Label(root, relief=GROOVE, font=font2, text="level").pack()
variable = StringVar(root)
variable.set("INFO") # default value
w = OptionMenu(root, variable, "CRITICAL", "DEBUG")
w.pack()
Button(root, font=font1, background= "yellow", text='START',command=main).pack()
Label(root, text="To end just close the CMD window").pack()
root.mainloop()
更新:launch
関数オブジェクトがコールバックとして設定されておらず、呼び出された関数自体が設定されていたため、Buttonコールバックが自動実行されていたことが判明しました。修正は、コールバックを置き換えて、lambda: spawnthread(fcn)
代わりに関数オブジェクトがコールバックとして設定されるようにすることです。これを反映するように回答が更新されました。それを逃してすみません。
GUIメインループは、他の関数を実行しようとするとフリーズし、それ自体を再起動する方法がありません(フリーズしているため)。
GUIメインループと一緒に実行したいコマンドがであるとしましょうmyfunction
。
輸入:
import time
import threading
import Queue
ThreadedClient
クラスを設定する必要があります。
class ThreadedClient(threading.Thread):
def __init__(self, queue, fcn):
threading.Thread.__init__(self)
self.queue = queue
self.fcn = fcn
def run(self)
time.sleep(1)
self.queue.put(self.fcn())
def spawnthread(fcn):
thread = ThreadedClient(queue, fcn)
thread.start()
periodiccall(thread)
def periodiccall(thread):
if(thread.is_alive()):
root.After(100, lambda: periodiccall(thread))
次に、関数を呼び出すウィジェットが代わりに関数を呼び出すようにしspawnthread
ます。
queue = Queue.Queue()
Button(root, text='START',command=lambda: spawnthread(myfunction)).pack() #<---- HERE
NB私はこれを私が持っているマルチスレッドのtkinterGUIから適応させています。私はすべてのフレームをクラスにラップしているので、少し調整しなければならなかったので、これにはいくつかのバグがあるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加