Использование pynput для удаления введенного текста после нажатия кнопки в окне PyQt - PullRequest
0 голосов
/ 28 марта 2020


Я работаю над регистратором с модулем pynput и клавиатурой (модуль клавиатуры для чтения пользовательского ввода и pynput для перезаписи исправленного текста), и я создал окно PyQt с двумя метками и двумя кнопками.
Пользователь вводит текст, и если он верен, ничего не происходит, в противном случае набранное слово удаляется (с помощью нажатия pynput (Key.backspace)), и после его выбора набирается новое слово, нажав одну из двух кнопок.
Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь нажимает кнопку, текстовый курсор теряет фокус с позиции, в которой было набрано исходное слово, поэтому pynput не может удалить неправильное слово и написать исправленное в нужном месте.
Я попытался воссоздать проблему (что-то не работает, как ожидалось - извините), но вы можете понять это.

import pynput
import keyboard
from pynput.keyboard import Key, Controller
from PyQt5 import QtCore, QtWidgets, uic
import sys
import time

pynput_keyboard = Controller()

class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi("untitled.ui", self)
        self.string = ""
        self.pushButton.clicked.connect(self.change_word)
        self.pushButton_2.clicked.connect(self.change_word)

        # this will activate the window
        self.activateWindow()

        self.show()

    def change_word(self):
        if (self.sender().text() == "B1"):
            pass
        elif (self.sender().text() == "B2"):
            for i in range(len(self.label.text())+1):
                pynput_keyboard.press(Key.backspace)
                pynput_keyboard.release(Key.backspace)

            for i, char in enumerate(self.label_2.text()):
                pynput_keyboard.press(char)
                pynput_keyboard.release(char)

def monitor(window):
    while True:
        event = keyboard.read_event()
        if event.event_type == keyboard.KEY_DOWN:
            if event.name == "space":
                window.label.setText(window.string)
                window.label_2.setText(window.string + "_changed")
                window.string = ""
            elif event.name in "abcdefghijklmnopqrstuvwxyz":
                window.string += event.name

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Ui()
    monitor(window)
    sys.exit(app.exec_())

gui показано выше.
gui

Я думал о некоторых решениях, таких как сохранение в переменной позиции текстового курсора прямо перед нажатием кнопки, но не смог ее решить.
! Я пытался воссоздать его как можно лучше.

Заранее спасибо!

...