Tkinterのエントリに入力した文字列をデータベースに書き込みたいのですが、Raspberry PiでやったところDB書き込みに少し時間がかかっているような気がしました。書き込みに時間がかかると次のデータ入力まで画面が止まってしまうのでなんか気に入りません。
そこでスレッドを使って入力をスムーズにしようと思って(これがいいやり方かはわかりませんが・・・)、次のようにソースコードを書きました。
Python
1import pymysql 2import threading 3import tkinter as tk 4 5 6def cnct(): 7 global cnctn, cur 8 cnctn = pymysql.connect( 9 host = "localhost", 10 user = "root", 11 password= "" , 12 db = "test", 13 charset = "utf8" 14 ) 15 cur = cnctn.cursor() 16 17 18def insert(): 19 global cnctn, cur, str 20 for i in range(100000): # とりあえずスレッドでできてるか見たいのでめっちゃDBに書き込む 21 cur.execute("INSERT INTO test VALUES(%s, %s);", (str, "abc")) 22 cnctn.commit() # コミットは逐次するよりも後で1回だけやったほうが時間かからない 23 24 25def discnct(): 26 global cnctn, cur 27 cur.close() 28 cnctn.close() 29 30def push(e): 31 global str, entry, t 32 str = entry.get() 33 print(str) 34 entry.delete(0, "end") 35 t = threading.Thread(target=func) 36 t.start() 37 #t.join() # ここに記述したらフリーズした 38 39 40def func(): 41 global t 42 cnct() 43 insert() 44 discnct() 45 t.join() 46 47 48win = tk.Tk() 49 50entry = tk.Entry(win) 51entry.grid() 52 53button = tk.Button(win, text="save") 54button.grid() 55 56button.bind("<ButtonRelease>", push) 57 58win.mainloop()
しかし
RuntimeError: cannot join current thread
とエラーが出てしまいます。
エラー文的にはt.join()がダメなのだろうと思いますが、どこに書けば良いかわかりません。
どのように対処すれば良いでしょうか?
回答よろしくお願いします。
また、
DB書き込み最中に閉じるボタンを押した時、とりあえずスレッド内でグローバルなフラグでも入れて、Trueの時は閉じないみたいなif文をつけて対処しようと思っています。
(ソースコードに終了時の動作を書いてないので考えていることだけ書いておきます。実現できるかはやってみないと自分にはわかりませんが・・・。)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/04 16:02
2020/06/06 08:48