追記
ご指摘ありがとうございます。
修正後のコードと、原因が何となく分かったので追記します。
参考にしたstackoverflow
で挙げられいていた質問を読み返したらこのようなことが書いてありました。
This occurs because you created the Tk main window on a thread and you don't have the UI running on the processes main thread
(tkinterのウィジェットはメインスレッド以外で作成してはならない)
もし作成した場合
When you exit the process the cleanup is being done from the process primary thread
(そのプロセスを削除する)
みたいです。つまりメインスレッドtk()からtk.loop()以外でウィジェットを作成してはならないということでしょうかね・・
これは非常に困った問題だなぁと思ったのですが
前に私が作ったアニメーションプログラムで一度作成してから中身を差し替えるという方法でこのエラー「async handler deleted by the wrong thread」が一回も出なかったので、あらかじめウィジェットを作成しておき中身を差し替えるという手段がありかもしれません。
(こちらはフルのコードを載せます。)
import time import tkinter as tk from PIL import Image, ImageTk import threading root = tk.Tk() root.geometry("800x600") canvas = tk.Canvas(root, width=190, # 幅を設定 height=200, ) canvas.place(x=0,y=0) image = Image.open("1.jpg") image.thumbnail((200, 200), Image.ANTIALIAS) img = ImageTk.PhotoImage(image) # 表示するイメージを用意 id = canvas.create_image( # キャンバス上にイメージを配置 0, # x座標 0, # y座標 image = img, # 配置するイメージオブジェクトを指定 anchor=tk.NW # 配置の起点となる位置を左上隅に指定 ) image = Image.open("2.jpg") image.thumbnail((200, 200), Image.ANTIALIAS) img1 = ImageTk.PhotoImage(image) # image = Image.open("3.jpg") image.thumbnail((200, 200), Image.ANTIALIAS) img2 = ImageTk.PhotoImage(image) # image = Image.open("4.jpg") image.thumbnail((200, 200), Image.ANTIALIAS) img3 = ImageTk.PhotoImage(image) # def animation(sleeptime) : while 1 : canvas.itemconfig(id,image=img) time.sleep(sleeptime) canvas.itemconfig(id,image=img1) time.sleep(sleeptime) canvas.itemconfig(id,image=img2) time.sleep(sleeptime) canvas.itemconfig(id,image=img3) time.sleep(sleeptime) th1 = threading.Thread(target=animation,args=(1,)) th1.start() tk.mainloop()
回答してくれた方がおっしゃったように、tkinterはウィジェットをクラス化して書いたほうがいいですね。ただ、最初に提示しようとしたコードは探り探り書いていてもう400行くらいになってしまったのでクラス化する体力がないです
で、解決策の続きですが、根本的な解決策はいまだに私は分かりません。さっきのstackoverflowのしつもんをみてもジェットを作成している部分だけをクラス化してメインスレッドで走らせているようにしているので、もうどうやってもサブスレッドではウィジェットを作成できないのかもしれません。非常に残念です・・・
//ここはスレッドを逐一作る処理を書き忘れていました、ソースを全部乗せるのはすいません、ちょっと無理です・・・・ def thread_button(): th1 = threading.Thread(target=btn_click1) th1.start()
前にも質問させていただきましたが、こちらの質問ですが
async handler deleted by the wrong threadというエラーを検索しても日本語の情報が全くありません。
stackoverfloweで似たような質問がありましたが、いまいち理解できませんでした。
わたしのソースコードは以下の通りです、スレッド関連はいろいろ調べましたが、お手上げ状態です。tkinterと関連しているためおこると考察しているのですが・・・
お力を借りたいです。
import tkinter as tk import thread def thread_button(): th1.start() def btn_click(): res = requests.get("http://aaa.com") root = tk.Tk() th1 = threading.Thread(target=btn_click) button= tk.Button(frame1_1,text="TEST", command=thread_button) button.pack() root.mainloop()

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。