当前位置: 首页 > article >正文

python如何非阻塞的监听按键(win linux亲测)

pyqt是python的强大扩展,让我们可以方便的操作界面。下面介绍pyqt 内容:如何监听单个按键(做非阻塞的获取)以及监听组合按键的方法

什么是监听,我们为什么需要监听?
我们的程序获得外部输入最简单的方法是input 但是这里是显示的获取输入,并且是阻塞性的。当我们不输入完成(按下回车)程序不会进行到下一步。很好用,但是我们并不总是需要这样,比如FPS这样的情景,你哪怕不输入,游戏仍然在进行,只有当你按下按钮的时候,游戏才会做出相应反应。这就是游戏在监听键盘,这就是非阻塞性的获得输入

监听单个按键的方法

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import Qt


class KeyboardListener(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Keyboard Listener')
        self.show()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            # 如果按下的是 Esc 键,关闭窗口
            self.close()
        else:
            # 输出按下的按键的键码
            print(f"Key pressed: {event.key()}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    listener = KeyboardListener()
    sys.exit(app.exec_())

解读一下这段pyqt的原理,我并们没有看到代码使用了keyPressEvent 函数,但是它仍然起作用了?

  • QWidgetkeyPressEvent 方法: 这个方法是 QWidget 类中的一个虚方法。QWidget 及其子类会在键盘按键事件发生时调用这个方法。你在 KeyboardListener 类中重写了这个方法,当按键事件发生时,重写的方法会被调用。

  • 事件传递机制: PyQt 使用事件传递机制来处理用户输入。当你重写 keyPressEvent 方法时,PyQt 会在按键事件发生时调用这个方法,而不是调用基类的实现。

  • 显示窗口: 调用 self.show() 方法来显示窗口,并进入事件循环,等待用户输入。

组合键监听

延续单按键监听的思路

  • 亲测windows可用
  • linux不可用
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import Qt


class KeyboardListener(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Keyboard Listener')
        self.show()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_S and event.modifiers() == Qt.ControlModifier:
            # 检测到 Ctrl + S 组合键
            print("Ctrl + S pressed")
        elif event.key() == Qt.Key_Escape:
            # 检测到 Esc 键
            self.close()
        else:
            # 输出按下的按键的键码
            print(f"Key pressed: {event.key()}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    listener = KeyboardListener()
    sys.exit(app.exec_())

适用shortcut 监听特定按键

  • windows可用
  • linux亲测可用
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QShortcut
from PyQt5.QtGui import QKeySequence
from PyQt5.QtCore import Qt


class KeyboardListener(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('Keyboard Listener')

        # 使用 QShortcut 设置 Ctrl+S 组合键
        self.shortcut_save = QShortcut(QKeySequence('Ctrl+S'), self)
        self.shortcut_save.activated.connect(self.on_ctrl_s_pressed)

        # 使用 QShortcut 设置 Ctrl+Q 组合键
        self.shortcut_quit = QShortcut(QKeySequence('Ctrl+Q'), self)
        self.shortcut_quit.activated.connect(self.on_ctrl_q_pressed)

        self.show()

    def on_ctrl_s_pressed(self):
        print("Ctrl + S pressed")

    def on_ctrl_q_pressed(self):
        print("Ctrl + Q pressed")
        self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    listener = KeyboardListener()
    sys.exit(app.exec_())
原文地址:https://blog.csdn.net/FlamBoyanceI/article/details/146228642
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/583823.html

相关文章:

  • 【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)
  • 【从零开始学习计算机科学】数据库系统(八)数据库的备份和恢复
  • 制造执行系统(MES)系统基本流程
  • 22 - 天 TCPIP 四层模型是什么?Cookie、Session、Token 之间有什么区别?从网络角度来看,用户从输入网址到网页显示,期间发生了什么?
  • 大白话在 React 中,如何处理表单的复杂验证逻辑?
  • Java中的Logback:高效日志管理解析
  • 如何设计微服务及其设计原则?
  • 【21】单片机编程核心技巧:if语句逻辑与真假判断
  • MCP服务协议详细介绍
  • 【春招笔试】2025.03.13-携程春招笔试
  • CCF CSP 第30次(2023.09)(1_坐标变换_C++)(先输入再计算;边输入边计算)
  • Docker配置代理,以保证可以快速拉取镜像
  • 基于ESP32的桌面小屏幕实战[8]:任务创建
  • 图的存储--十字链表与邻接多重表
  • 2020年SCI1区TOP:自适应粒子群算法MPSO,深度解析+性能实测
  • 【GPT入门】第18课 langchain介绍与API初步体验
  • 【蓝桥杯速成】| 2.逆向思维
  • 双链笔记新选择!使用Docker私有化部署Logseq知识库远程团队协作
  • STM32 单片机常见的 8 种输入输出模式
  • 【算法day9】回文数-给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。