前提
Python Tkinterを使ってアプリを作っています。
Treeviewでドラッグするとスクロールしながら複数選択する機能を実装中に操作不能になってしまいます。
エラーメッセージは発生せず固まります。
実現したいこと
- 固まる理由を教えていただき、解消したい。
- 現在はスレッドを使ってスクロールしているが、他にシンプルな方法あれば教えていただきたい。
該当のソースコード
import
1import tkinter.ttk as ttk 2import threading 3import time 4 5class Application(tk.Frame): 6 def __init__(self,master): 7 super().__init__(master) 8 self.pack() 9 10 columns = ["a","b","c","d"] 11 self.tree = ttk.Treeview(self, columns= columns) 12 for i in range(50): 13 self.tree.insert("",i,text="No."+str(i),values=("a"+str(i),"b"+str(i),"c"+str(i),"d"+str(i),)) 14 15 #スクロールバー 16 hbar = ttk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.tree.xview) 17 vbar = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.tree.yview) 18 self.tree.configure(xscrollcommand=hbar.set, yscrollcommand=vbar.set) 19 20 #配置 21 self.tree.grid(row=0,column=0,sticky="nsew") 22 hbar.grid(row=1,column=0,sticky="ew") 23 vbar.grid(row=0,column=1,sticky="ns") 24 25 self.thread = None 26 self.is_alive = False 27 self.posy = None 28 self.posy1 = None 29 self.start_id = None 30 31 #bind 32 def b1_press(e): 33 self.posy=e.y 34 self.start_id = self.tree.identify_row(self.posy) 35 self.tree.bind("<ButtonPress-1>",b1_press) 36 37 def b1_motion(e): 38 self.posy1=e.y 39 if not self.is_alive: 40 self.is_alive = True 41 self.thread = threading.Thread(target=self.func) 42 self.thread.start() 43 self.tree.bind("<Button1-Motion>",b1_motion) 44 45 def b1_release(e): 46 if self.is_alive: 47 print("リリース スレッド終了開始") 48 self.is_alive=False 49 self.thread.join() 50 self.thread = None 51 self.posy = None 52 self.posy1 = None 53 print("リリース スレッド終了完了") 54 self.tree.bind("<ButtonRelease-1>",b1_release) 55 56 def func (self,): 57 i=0 58 while self.is_alive: 59 i+=1 60 if self.posy1 == self.posy or self.posy1 == None: 61 self.tree["cursor"]="target" 62 continue 63 elif self.posy < self.posy1: 64 self.tree["cursor"]="sb_down_arrow" 65 self.tree.yview_scroll(1,"units") 66 else: 67 self.tree["cursor"]="sb_up_arrow" 68 self.tree.yview_scroll(-1,"units") 69 time.sleep(0.2) 70 71 #範囲選択 72 tpl=() 73 print("止まってしまう") 74 end=self.tree.identify_row(self.posy1)#ここで止まる 75 print("進んだ") 76 is_add=False 77 for iid in self.tree.get_children(): 78 if self.start_id == end: 79 tpl=(self.start_id,) 80 break 81 if iid == self.start_id or iid == end: 82 is_add= not is_add #反転 83 if is_add == True: 84 tpl+=(iid,) 85 self.tree.selection_set(tpl) 86 87if __name__ == "__main__": 88 89 root = tk.Tk() 90 app = Application(master=root) 91 app.mainloop() 92
試したこと
ButtonRelease-1 でスレッドの終了させるとき、以下のコードで止まっています。
"end=self.tree.identify_row(self.posy1)#ここで止まる"
なぜ、ButtonRelease-1イベントを経由すると動かなくなるのかわかりません。
補足情報(FW/ツールのバージョンなど)
python 3.9.5
VScode 1.74.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/17 07:43