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 函数,但是它仍然起作用了?
-
QWidget
的keyPressEvent
方法: 这个方法是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 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/583823.html 如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!