[Python]Tkinterとpynputによる左クリックの検出
Tkinterによって作られたボタンを押すと、クリック検出関数が呼び出されて画面上のクリックを検出(クリックされた座標)したいです。
発生している問題・エラーメッセージ
追記:行いたいことは、プログラムは起動したままでの、pynputでのクリック検出の停止です。 スタートボタンとストップボタンによりクリック検出を操作したいです。 スレッドに投げてクリックの検出をしようとしたところ、スレッドの終了方法がわからずにプログラムを正常終了させることができない。 以下のプログラムを実行するとクリックの検出はできている。しかし、作成したウィンドウを消してもスレッドが生きているためプログラムを終了させることができない。Ctrl+Cを押しても無反応です。
該当のソースコード
Python
1import tkinter as tk 2import time 3import threading 4from pynput import mouse 5 6class Application(tk.Frame): 7 thread=None 8 def __init__(self,master): 9 super().__init__(master) 10 self.pack() 11 12 master.geometry("300x150") 13 master.title("クリック検出") 14 15 self.canvas = tk.Canvas(master,width=290,height=80,bg="skyblue") 16 self.canvas.place(x=3,y=10) 17 18 tk.Button(master,text="スタート",command=self.startButtonClick,width=10).place(x=110, y=110) 19 tk.Button(master,text="ストップ",command=self.stopButtonClick,width=10).place(x=210, y=110) 20 21 22 23 def startButtonClick(self): 24 self.alive=True 25 self.started=threading.Event() 26 if self.thread == None: 27 self.thread = threading.Thread(target=click_listen) 28 self.thread.start() 29 30 def stopButtonClick(self): 31 #ここに終了処理をさせる関数を書きたい 32 pass 33 34 35def on_click(x, y, button, pressed): 36 print('{0} at {1}'.format('Pressed' if pressed else 'Released',(int(x), int(y)))) 37 38 39def click_listen(): 40 41 while(True): 42 with mouse.Listener(on_click=on_click) as listener: 43 listener.join() 44 45def main(): 46 win = tk.Tk() 47 app = Application(master=win) 48 app.mainloop() 49 50if __name__ == "__main__": 51 main()
試したこと
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー