我正在使用PySide2创建UI,我目前拥有的功能之一是我想使用键盘发送命令(为此我正在使用Pynput)。我进行了设置,以便按ESC键将停止侦听器。但是,按下此按钮会关闭我的整个UI,理想情况下,我希望避免这样做。我想要发生的是侦听器停止并且我可以继续使用UI。我的代码简化了on_press:
def tab2(self):
def button():
def on_press(key):
try:
if key.char == 'w':
print("up")
if key.char == 's':
print("down")
if key.char == 'a':
print("left")
if key.char == 'd':
print("right")
if key == Key.esc:
# Stop listener
listener.stop()
except AttributeError:
pass
# Collect events until released
self.lineedit.setText("Running using WASD")
with Listener(on_press=on_press) as listener:
listener.join()
# creates groupbox in which start button gets added
self.tab_2 = QGroupBox()
layout = QVBoxLayout()
label = QLabel("Move the setup using the WASD keys\nStop the control process using the ESC button")
label.setAlignment(Qt.AlignCenter)
layout.insertSpacerItem(0, QSpacerItem(0, 10))
layout.addWidget(label, 1)
startbutton = QPushButton("Start")
startbutton.clicked.connect(button)
layout.addWidget(startbutton, 2)
layout.insertSpacerItem(4, QSpacerItem(0, 120))
self.tab_2.setLayout(layout)
这将构成对我自己问题的最裸露的答案。该问题部分是由于使用.char引起的,该字符不断引发AttributeError异常,现在可以使用键盘导入来解决。另一个问题是使用ESC键作为停止,程序不再使用例如控制键关闭。
from pynput.keyboard import Key, Listener
import keyboard
import sys
from PySide2.QtWidgets import (QApplication, QLabel, QPushButton, QVBoxLayout, QDialog)
qt_app = QApplication(sys.argv)
class GUI(QDialog):
def __init__(self, parent=None):
super(GUI, self).__init__(parent)
self.originalPalette = QApplication.palette()
layout = QVBoxLayout()
label = QLabel("Move the setup using the WASD keys\nStop the control process using the Left control button")
layout.addWidget(label, 1)
startbutton = QPushButton("Start")
startbutton.clicked.connect(self.button)
layout.addWidget(startbutton, 2)
self.setLayout(layout)
def button(self):
def on_press(key):
if keyboard.is_pressed('w'):
print("up")
elif keyboard.is_pressed('s'):
print("down")
elif keyboard.is_pressed('a'):
print("left")
elif keyboard.is_pressed('d'):
print("right")
elif key == Key.ctrl_l:
# Stop listener
return False
# Collect events until released
with Listener(on_press=on_press) as listener:
listener.join()
def run(self):
# Show the form
self.show()
# Run the qt application
qt_app.exec_()
app = GUI()
app.run()