RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1588392
Accepted
Роман Копачев
Роман Копачев
Asked:2024-07-26 04:52:18 +0000 UTC2024-07-26 04:52:18 +0000 UTC 2024-07-26 04:52:18 +0000 UTC

我无法立即读取 python 键盘上的按键和释放

  • 772

我最近决定从头开始制作自己的游戏。我决定做的第一件事是创建一个按键绑定系统。我轻松制作了两种类型 - [单击,切换]。然而,随着最受欢迎的类型“hold”的创建,问题出现了。我无法同时跟踪按下和释放(新线程根本不会创建。我通过 threading.active_count() 查看了这一点)。我怎样才能解决这个问题。我有一个逐笔检查的想法(键盘在循环中跟踪,等待 0.1 秒。您可以在一次滴答中检查按下,在下一次滴答中检查释放,依此类推)整个代码相当大,所以我只给出循环。

f_Kb 是一个类,我在其中编写了 check_button_press 和 check_button_release 方法,分别检查给定的键是否被按下或释放。

i = 0
while i < 100/0.1: #цикл идет 100 секунд
    z = 0
    while z < len(f_Kb.type): обнуление всех кулдаунов (для предотвращения ложных, повторных считываний)
        f_Kb.cooldowns[z] = False
        z += 1
    
    z = 0
    while z < len(f_Kb.online_keys): #запуск функций у активных биндов
        f_Kb.behaviours[f_Kb.get_index_by_object(f_Kb.online_keys[z],f_Kb.keys)]()
        z += 1

   
    #...............проблемное место.................
    keyboard.on_release(f_Kb.check_button_press)
    keyboard.on_press(f_Kb.check_button_release)
    i += 1

我怎样才能实现我的想法?

python
  • 1 1 个回答
  • 13 Views

1 个回答

  • Voted
  1. Best Answer
    Amgarak
    2024-07-26T10:05:15Z2024-07-26T10:05:15Z

    有趣的问题,我决定为你做一个小例子:

    import keyboard
    import threading
    import queue
    import time
    
    class KeyTracker:
        def __init__(self, callback):
            self.pressed_keys = set()
            self.callback = callback
            self.queue = queue.Queue()
    
            keyboard.hook(self.key_event)
    
            self.callback_thread = threading.Thread(target=self.queue_callback)
            self.callback_thread.start()
    
        def key_event(self, event):
            if event.event_type == keyboard.KEY_DOWN:
                if event.name not in self.pressed_keys:
                    self.pressed_keys.add(event.name)
                    self.queue.put(self.pressed_keys)
                    print(f"Нажата клавиша: {event.name}")  
                        
            elif event.event_type == keyboard.KEY_UP:
                if event.name in self.pressed_keys:
                    self.pressed_keys.remove(event.name)
                    self.queue.put(self.pressed_keys)
                    print(f"Отпущена клавиша: {event.name}")  
    
        def queue_callback(self):
            while True:
                pressed_keys = self.queue.get()
                if pressed_keys is None:
                    break  
                self.callback(pressed_keys)
    
        def stop(self):
            self.queue.put(None)  
            self.callback_thread.join()
    
        def start(self):
            try:
                keyboard.wait('esc')
            except KeyboardInterrupt:
                pass
            finally:
                self.stop()
    
    threads = {}
    
    def pressed_keys(keys):
        print(f"Активные клавиши: {keys}")
        if 'z' in keys and 'z' not in threads:
            threads['z'] = threading.Thread(target=z_pressed, args=(keys,))
            threads['z'].start()
            
        if 'x' in keys and 'x' not in threads:
            threads['x'] = threading.Thread(target=x_pressed, args=(keys,))
            threads['x'].start()
            
        keys_v_b = {'v', 'b'}
        if keys_v_b.issubset(keys) and 'v+b' not in threads:
            threads['v+b'] = threading.Thread(target=v_b_pressed, args=(keys,))
            threads['v+b'].start()
    
    def z_pressed(keys):
        while 'z' in keys:
            print("Зажата Z")
            time.sleep(0.2) 
        del threads['z']
            
    def x_pressed(keys):
        while 'x' in keys:
            print("Зажата x")
            time.sleep(0.2) 
        del threads['x']
            
    def v_b_pressed(keys):
        while all(key in keys for key in ('v', 'b')):
            print("Зажата v+b")
            time.sleep(0.2) 
        del threads['v+b']
    
    if __name__ == "__main__":
        tracker = KeyTracker(pressed_keys)
        tracker.start()
    

    在此输入图像描述 在此输入图像描述

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5