#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)