pynput在停止侦听器时关闭UI

问题描述 投票:-1回答:1

我正在使用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)
python pyside2 pynput
1个回答
0
投票

这将构成对我自己问题的最裸露的答案。该问题部分是由于使用.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()
© www.soinside.com 2019 - 2024. All rights reserved.