66386


Pythonの[Keyboardモジュール](https://pypi.org/project/keyboard/)を使って以下のコードを作成してみました。  
キーボードのホットキーを登録し、キーが押されたらexecuteHotKey関数が実行されます。

[code]

    import tkinter as tk
    import threading
    import time
    import keyboard 
    
    class threadingGUI():
        def __init__(self):
            self.frame=1
            self.stop_flag=False
            self.thread=None
    
        def executeHotKey(self):
            print("key press")
    
        #時間をカウント
        def time_count(self):
            while not self.stop_flag:
                #keyboard.read_hotkey()
                if keyboard.is_pressed('a') == True:
                    print("test")
                print(self.frame)
                self.frame=self.frame+1
                time.sleep(1)
    
        def start(self):
            if not self.thread:
                #キーボード入力を待ち受ける
                keyboard.add_hotkey('a', self.executeHotKey)
                keyboard.add_hotkey('b', self.executeHotKey)
                keyboard.add_hotkey('c', self.executeHotKey) 
                self.thread = threading.Thread(target=self.time_count)
                self.stop_flag=False
                self.thread.start()
    
    
        def stop(self):
            if self.thread:
                self.stop_flag=True
                self.thread.join()
                self.thread=None
    
        def GUI_start(self):
            root=tk.Tk()
            Button001=tk.Button(root,text="Start",command=self.start)
            Button001.pack()
            Button002=tk.Button(root,text="Stop",command=self.stop)
            Button002.pack()
            root.mainloop()
    
            self.stop_flag=True
            self.thread.join()
    
    t = threadingGUI()
    t.GUI_start()
    
[/code]

上記のコードで、キーボードのaキーを押すと問題なくexecuteHotKey関数が実行され  
コンソールに"key press"と表示されます。

しかし、私は毎フレームごとに押されているキーの状態も知りたいため、以下のような記述をしているのですが、これが反応してくれません。

[code]

        if keyboard.is_pressed('a') == True:
            print("test")
    
[/code]

キーが押されているかどうかを取得するにはどうしたら良いのでしょうか？


CC BY-SA 4.0
2020-05-07T05:19:32.200
66372
2020-05-07T10:19:15.900
2020-05-07T05:27:49.483
34471
34471
question
python
PythonのKeyboardモジュールでキーが押されているか確認する方法について


KeyPress event を記録しておくのはどうでしょうか。以下のコードでは `threadingGUI.keypressed` に KeyPress
event を追加していて、`threading.lock(threading.Lock() instance)` で排他制御を行っています。

[code]

    import tkinter as tk
    import threading
    import time
    import keyboard
    
    class threadingGUI():
        def __init__(self):
            self.frame=1
            self.lock = threading.Lock()
            self.keypressed = []
            self.stop_flag=False
            self.thread=None
    
        def executeHotKey(self, c):
            self.lock.acquire()
            self.keypressed.append(c)
            self.lock.release()
            print("key press")
    
        #時間をカウント
        def time_count(self):
            while not self.stop_flag:
                self.lock.acquire()
                if 'a' in self.keypressed:
                    print("test")
                self.keypressed = []
                self.lock.release()
                print(self.frame)
                self.frame=self.frame+1
                time.sleep(1)
    
        def start(self):
            if not self.thread:
                #キーボード入力を待ち受ける
                [keyboard.add_hotkey(c, self.executeHotKey, args=(c))
                 for c in ('a', 'b', 'c')]
                self.thread = threading.Thread(target=self.time_count)
                self.stop_flag=False
                self.thread.start()
    
        def stop(self):
            if self.thread:
                self.stop_flag=True
                self.thread.join()
                self.thread=None
    
        def GUI_start(self):
            root=tk.Tk()
            Button001=tk.Button(root,text="Start",command=self.start)
            Button001.pack()
            Button002=tk.Button(root,text="Stop",command=self.stop)
            Button002.pack()
            root.mainloop()
    
    if __name__ == '__main__':
    
        t = threadingGUI()
        t.GUI_start()
    
[/code]


CC BY-SA 4.0
2020-05-07T10:19:15.900
66386
2020-05-07T10:19:15.900
66372
answer