Динамическое изменение текста метки на основе пользовательского ввода - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь создать приложение с 2 python файлами, первое считывает пользовательский ввод (либо из оболочки python, либо напрямую с клавиатуры через такие модули, как pynput-keyboard) и сохраняет его в переменной (после пробел нажат). Затем он отправляет исходную строку и новую строку преобразования на метки gui.

Второй создает gui, который имеет 2 метки и две кнопки и берет переменную, переданную из первого файла, и изменяет метки на основе этой переменной (кнопки используются для вставки данных на более позднем этапе в базу данных).

Я создал сценарии gui и python, которые читают ввод, но я я изо всех сил пытаюсь передать эту переменную во второй скрипт и динамически менять метку.

Пожалуйста, посмотрите примеры кода выше.

read_user_input.py

import keyboard
import gui

def transform_string(string):
    if len(string)>0:
        return string[0:len(string)-1]
    else:
        return "0"

def logging_function():
    string = ""

    while(True):
        event = keyboard.read_event()
        if (str(event)[-5:-1] == "down"):
            key_pressed = ((str(event).rsplit(' ', 1))[0])[14:]

            if (key_pressed == "space"):
                """PASS THIS string AND transform_string TO OUR GUI's LABELS"""
                print("Pass to gui's labels")
            else:
                string = string + key_pressed




logging_function()

gui .ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Hook</class>
 <widget class="QMainWindow" name="Hook">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>237</width>
    <height>120</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Hook</string>
  </property>
  <property name="windowIcon">
   <iconset>
    <normaloff>10-03-2020 thesis_01/keyboard.ico</normaloff>10-03-2020 thesis_01/keyboard.ico</iconset>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QLabel" name="label">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>0</y>
      <width>131</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>Label1</string>
    </property>
   </widget>
   <widget class="QLabel" name="label_2">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>40</y>
      <width>131</width>
      <height>31</height>
     </rect>
    </property>
    <property name="mouseTracking">
     <bool>false</bool>
    </property>
    <property name="text">
     <string>Label2</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>0</y>
      <width>61</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>B1</string>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>42</y>
      <width>61</width>
      <height>31</height>
     </rect>
    </property>
    <property name="text">
     <string>B2</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>237</width>
     <height>21</height>
    </rect>
   </property>
   <widget class="QMenu" name="menuHook">
    <property name="title">
     <string>Hook</string>
    </property>
   </widget>
   <widget class="QMenu" name="menuHelp">
    <property name="title">
     <string>Help</string>
    </property>
   </widget>
   <addaction name="menuHook"/>
   <addaction name="menuHelp"/>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

gui .py

from PyQt5 import QtWidgets, uic
import sys

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__() # Call the inherited classes __init__ method
        uic.loadUi('untitled.ui', self) # Load the .ui file
        self.show() # Show the GUI

app = QtWidgets.QApplication(sys.argv) # Create an instance of QtWidgets.QApplication
window = Ui() # Create an instance of our class
app.exec_() # Start the application

Окно пользовательского интерфейса выглядит так:

Ui

1 Ответ

3 голосов
/ 20 марта 2020

Что вам нужно сделать, это использовать прослушиватель 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_())
...