Tkinter GUI 内でのスレッド クラスの操作に問題があります。Tkinter GUI の起動時に、デーモンを使用して新しい Threading & Queue オブジェクトを作成し、起動します。Tkinter GUI には、内部メソッドを呼び出すボタンがあります。次に、このメソッドは Queue オブジェクトの put を呼び出し、以下に掲載されます。Threading オブジェクトは、私が期待するすべての必要なアクションを実行します。
def my_method_threaded(self, my_name):
try:
self.queue.put(("test", dict(name=my_name)))
self.label_str_var.set('')
self.queue.join()
except:
self.error_out(msg=traceback.format_exc())
ただし、終了後に問題が発生しています。を呼び出すとself.queue.join()
、set
呼び出しは実行されず、スレッドがタスクを完了した後にアプリがフリーズします。join()
コマンドをコメントアウトすると、set
呼び出しは実行されますが、ボタンは何もしない後、最初にのみ機能します(ロガーを使用してメソッドが何をしているかを追跡していrun()
ます。最初に呼び出されるだけです)。
join() と Tkinter ループの呼び出しに問題があると想定しているため、最初の問題が発生します。誰もが2番目の問題に光を当てることができますか? さらにコードが必要な場合は、お知らせください。
編集: 私が気付いた 2 番目の問題は、while True
呼び出したにもかかわらず、ループがアクションを 2 回実行することself.queue.task_done()
です。run メソッドのコードは次のとおりです。
def run(self):
args = self._queue.get()
my_name = args[1]["name"]
while True:
if my_name == "Barry":
#calls a static method elsewhere
self.queue.task_done()