Что вам нужно сделать, это использовать прослушиватель pynput и проанализировать код ключа, затем в соответствии с этим построить слово и отправить его с помощью сигнала на GUI, который согласно его собственным логам c добавляет его к QLabels:
read_user_input.py
from pynput.keyboard import Key, Listener
from PyQt5 import QtCore
class KeyMonitor(QtCore.QObject):
wordPressed = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
self.listener = Listener(on_release=self.on_release)
self.word = ""
def on_release(self, key):
if hasattr(key, "char"):
self.word += key.char
if key == Key.space:
self.wordPressed.emit(self.word)
self.word = ""
def stop_monitoring(self):
self.listener.stop()
def start_monitoring(self):
self.listener.start()
gui .py
from itertools import cycle
import sys
from PyQt5 import QtCore, QtWidgets, uic
from read_user_input import KeyMonitor
class Ui(QtWidgets.QMainWindow):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi("untitled.ui", self)
self.show()
self.labels = cycle([self.label, self.label_2])
@QtCore.pyqtSlot(str)
def on_word_pressed(self, word):
le = next(self.labels)
le.setText(word)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Ui()
monitor = KeyMonitor()
monitor.wordPressed.connect(window.on_word_pressed)
monitor.start_monitoring()
sys.exit(app.exec_())
Обновление:
Если вы хотите использовать библиотеку клавиатуры, вы должны использовать следующее:
read_user_input.py
import threading
import keyboard
from PyQt5 import QtCore
class KeyMonitor(QtCore.QObject):
wordPressed = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super().__init__(parent)
self.word = ""
self.listener = threading.Thread(target=self._task, daemon=True)
def _task(self):
while True:
event = keyboard.read_event()
if event.event_type == keyboard.KEY_DOWN:
if event.name == "space":
self.wordPressed.emit(self.word)
self.word = ""
elif len(event.name) == 1:
self.word += event.name
def start_monitoring(self):
self.listener.start()
Обновление:
Логика c изменения данных - тривиальная задача, которая состоит из схождения слова и генерации новых строк:
import sys
from PyQt5 import QtCore, QtWidgets, uic
from read_user_input import KeyMonitor
class Ui(QtWidgets.QMainWindow):
def __init__(self):
super(Ui, self).__init__()
uic.loadUi("untitled.ui", self)
self.show()
@QtCore.pyqtSlot(str)
def on_word_pressed(self, word):
try:
x = int(word)
except ValueError:
print("You must enter a whole number")
else:
self.label.setText("{}".format(x + 2))
self.label_2.setText("Changed {}".format(x - 2))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Ui()
monitor = KeyMonitor()
monitor.wordPressed.connect(window.on_word_pressed)
monitor.start_monitoring()
sys.exit(app.exec_())