PythonのKeyboardモジュールでキーが押されているか確認する方法について

投稿者: Anonymous

PythonのKeyboardモジュールを使って以下のコードを作成してみました。
キーボードのホットキーを登録し、キーが押されたらexecuteHotKey関数が実行されます。

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()

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

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

    if keyboard.is_pressed('a') == True:
        print("test")

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

解決

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

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()
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *