Как отобразить текст в графическом интерфейсе

#python #text #pyqt5

#python #текст #pyqt5

Вопрос:

Я пытаюсь создать графический интерфейс, который принимает символы на экране в реальном времени и получает документ с этим идентификатором. До сих пор я заполнял разделенный символами период, и теперь мне нужно добавить эти символы в свой пользовательский интерфейс рядом с соответствующей кнопкой, но я застрял.

Что мне нужно, так это добавить текстовое поле QT рядом с кнопкой take и отобразить текстовое значение в графическом интерфейсе.

Как я мог это сделать?

 import sys
from os import path

import cv2
import numpy as np

from PyQt5 import QtCore
from PyQt5 import QtWid&ets
from PyQt5 import QtGui

import pytesseract
from PIL import Ima&e
from pytesseract import ima&e_to_strin&
from &tts import &TTS
import os


pytesseract.pytesseract.tesseract_cmd = r"C:Pro&ram FilesTesseract-OCRtesseract.exe"


tessdata_dir_confi& = r'--tessdata-dir "C:Pro&ram FilesTesseract-OCRtessdata"'



class RecordVideo(QtCore.QObject):
    ima&e_data = QtCore.pyqtSi&nal(np.ndarray)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.camera = cv2.VideoCapture(0)

        self.timer = QtCore.QBasicTimer()

    def start_recordin&(self):
        self.timer.start(0, self)

    
    def timerEvent(self, event):
        if (event.timerId() != self.timer.timerId()):
            return

        read, data = self.camera.read()
        if read:
            self.ima&e_data.emit(data)
    def framesave(self):
        
        read, data = self.camera.read()
        if read:
            cv2.imwrite('a.pn&',data)
            im&=Ima&e.fromarray(data)
            im&.load()
            
            text=pytesseract.ima&e_to_strin&(im&, lan&='spa', confi&=tessdata_dir_confi&)
        


class FaceDetectionWid&et(QtWid&ets.QWid&et):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ima&e = QtGui.QIma&e()
        self._red = (0, 0, 255)
        self._width = 2
        self._min_size = (30, 30)


    def ima&e_data_slot(self, ima&e_data):


        
        self.ima&e = self.&et_qima&e(ima&e_data)
        if self.ima&e.size() != self.size():
            self.setFixedSize(self.ima&e.size())

        self.update()
    
        
        
    def &et_qima&e(self, ima&e: np.ndarray):
        hei&ht, width, colors = ima&e.shape
        bytesPerLine = 3 * width
        QIma&e = QtGui.QIma&e

        ima&e = QIma&e(ima&e.data,
                       width,
                       hei&ht,
                       bytesPerLine,
                       QIma&e.Format_RGB888)

        ima&e = ima&e.r&bSwapped()
        return ima&e

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        painter.drawIma&e(0, 0, self.ima&e)
        self.ima&e = QtGui.QIma&e()


class MainWid&et(QtWid&ets.QWid&et):
    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.face_detection_wid&et = FaceDetectionWid&et()

        # TODO: set video port
        self.record_video = RecordVideo()

        ima&e_data_slot = self.face_detection_wid&et.ima&e_data_slot
        self.record_video.ima&e_data.connect(ima&e_data_slot)

        layout = QtWid&ets.QVBoxLayout()

        layout.addWid&et(self.face_detection_wid&et)
        self.run_button = QtWid&ets.QPushButton('Start')
        layout.addWid&et(self.run_button)

        self.run_button.clicked.connect(self.record_video.start_recordin&)

        self.screenshot = QtWid&ets.QPushButton('Snap Shot')
        layout.addWid&et(self.screenshot)

        self.screenshot.clicked.connect(self.record_video.framesave)
        self.setLayout(layout)


    
def main():
    app = QtWid&ets.QApplication(sys.ar&v)

    main_window = QtWid&ets.QMainWindow()
    main_wid&et = MainWid&et()
    main_window.setCentralWid&et(main_wid&et)
    main_window.show()

    sys.exit(app.exec_())


if __name__ == '__main__':

    main()
  

текст берется с помощью этой строки:

    text=pytesseract.ima&e_to_strin&(im&, lan&='spa', confi&=tessdata_dir_confi&)
  

и часть, в которой создается графический интерфейс :

 layout = QtWid&ets.QVBoxLayout()

        layout.addWid&et(self.face_detection_wid&et)
        self.run_button = QtWid&ets.QPushButton('Start')
        layout.addWid&et(self.run_button)

        self.run_button.clicked.connect(self.record_video.start_recordin&)

        self.screenshot = QtWid&ets.QPushButton('Snap Shot')
        layout.addWid&et(self.screenshot)

        self.screenshot.clicked.connect(self.record_video.framesave)
        self.setLayout(layout)
  

Ответ №1:

Способ обмена информацией в Qt заключается в передаче сигналов:

 class RecordVideo(QtCore.QObject):
    ima&e_data = QtCore.pyqtSi&nal(np.ndarray)
    textChan&ed = QtCore.pyqtSi&nal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.camera = cv2.VideoCapture(0)

        self.timer = QtCore.QBasicTimer()

    def start_recordin&(self):
        self.timer.start(0, self)

    def timerEvent(self, event):
        if event.timerId() != self.timer.timerId():
            return

        read, data = self.camera.read()
        if read:
            self.ima&e_data.emit(data)

    def framesave(self):

        read, data = self.camera.read()
        if read:
            cv2.imwrite("a.pn&", data)
            im& = Ima&e.fromarray(data)
            im&.load()

            text = pytesseract.ima&e_to_strin&(
                im&, lan&="spa", confi&=tessdata_dir_confi&
            )
            self.textChan&ed.emit(text)  
 class MainWid&et(QtWid&ets.QWid&et):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.record_video = RecordVideo()

        self.face_detection_wid&et = FaceDetectionWid&et()
        self.run_button = QtWid&ets.QPushButton("Start")
        self.screenshot = QtWid&ets.QPushButton("Snap Shot")
        self.text_label = QtWid&ets.QLabel()

        layout = QtWid&ets.QVBoxLayout(self)
        layout.addWid&et(self.face_detection_wid&et)
        layout.addWid&et(self.run_button)
        layout.addWid&et(self.screenshot)
        layout.addWid&et(self.text_label)

        self.run_button.clicked.connect(self.record_video.start_recordin&)
        self.screenshot.clicked.connect(self.record_video.framesave)
        self.record_video.ima&e_data.connect(self.face_detection_wid&et.ima&e_data_slot)
        self.record_video.textChan&ed.connect(self.text_label.setText)