Python 如何在执行长按键的同时处理短按键?
我尝试用Python和PyQt4编写简单的游戏。这是一个简单的平台游戏,我想在“移动”按键过程中处理“跳跃”按键 这就像我按住Python 如何在执行长按键的同时处理短按键?,python,python-3.x,pyqt,pyqt4,Python,Python 3.x,Pyqt,Pyqt4,我尝试用Python和PyQt4编写简单的游戏。这是一个简单的平台游戏,我想在“移动”按键过程中处理“跳跃”按键 这就像我按住向右箭头键,同时按下z(或者任何键,可以是shift、ctrl、cmd、alt),我想继续向右移动,同时执行跳转 当我使用keyPressEvent时,长按“移动”键可以正常工作,但每次按“跳跃”键都会中断移动,我需要按箭头继续 为了更好地理解我想要实现的目标,让我们看看以下内容: (>表示移动的右箭头,z表示跳跃) 键:>>>>>>>>>>>>>>> .
向右箭头
键,同时按下z
(或者任何键,可以是shift、ctrl、cmd、alt),我想继续向右移动,同时执行跳转
当我使用keyPressEvent
时,长按“移动”键可以正常工作,但每次按“跳跃”键都会中断移动,我需要按箭头继续
为了更好地理解我想要实现的目标,让我们看看以下内容:
(>表示移动的右箭头,z表示跳跃)
键:>>>>>>>>>>>>>>>
. Z
.
. o
球员:哦
正如您所见,我按住
,玩家移动。同时,当我按下z
键时,即使仍然按下
键,播放器也会跳跃并停止
可以在pyqt中执行此操作吗?也许我需要一些外部图书馆?任何帮助都将不胜感激
解决了强> 感谢@Brendan Abel的回答,我已经做了我需要的一切:) 代码与此类似(为了清晰起见,我对代码进行了简化):
类测试(QtGui.QMainWindow):
按下按钮={
QtCore.Qt.Key_左:False,
QtCore.Qt.Key_Right:False,
QtCore.Qt.Key_Z:False,
}
定义初始化(自):
self.timer=QtCore.QTimer(self)
self.timer.timeout.connect(self.key\u操作)
自动定时器启动(100)
#为简单起见,定义隐藏
self.key\u操作={
QtCore.Qt.Key_左:self.player_向后移动,
QtCore.Qt.Key\u右:self.player\u前进,
QtCore.Qt.Key_Z:self.player_跳跃,
}
def按键事件(自,e):
key=e.key()
自按按键[按键]=真
def钥匙释放事件(自身,e):
key=e.key()
自按按键[按键]=错误
def按键动作(自身):
对于键,在self中按下。按下键。项()
如果按了以下按钮:
动作=自我。键\动作[键]
行动()
self.update()
我的游戏现在是这样的:
您可能需要定期轮询键盘状态,以确定要处理的控件。不幸的是,Qt没有用于轮询键盘状态的直接API。您必须通过维护具有按键按下事件但没有按键释放事件的按键的全局地图来跟踪哪些按键已按下。然后定期轮询该地图,以获得按下的键列表
pressed_keys = set()
def keyPressEvent(self, event):
pressed_keys.add(event.key())
def keyReleaseEvent(self, event):
pressed_keys.remove(event.key())
添加键时,您可以选择是否也要添加修改键(即shift、ctrl、alt)(使用event.modifiers()
),以及是否只应用于第一次按下的键,还是应用于所有按下的键
您可以使用QTimer
进行轮询。基本上,您将根据QTimer.timeout
进行更新,而不是keyPressEvent
触发游戏更新
timer = QTimer()
timer.timeout.connect(self.update_game)
timer.start(100) # Update rate
@QtCore.pyqtSlot()
def update_game(self):
if Qt.Key_Space in pressed_keys:
...
if Qt.Key_Up in pressed_keys:
...
您也可以选择不使用
QTimer
进行更新,并继续使用keypress
和keyprelease
事件触发更新,但您仍然需要保持按键的持续状态。至少如果没有按键功能,您将不会得到太多帮助,例如,QKeySequence(Qt.Right+Qt.Up)来处理您的问题。是的,就是这样!我已经看到了一些类似问题的答案,但是你的答案包括Timer
引导我找到了正确的方向!它的工作就像一个魔咒,所有按下的键现在都被完全处理,我的应用程序独立于系统“按键频率”。