PyQT中的打字效果如何?

how Typing effect in PyQT?

我有以下程序,但事实证明,当它必须传递文本时,程序卡住了,无法逐个字母地显示

import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from time import sleep
from mensaje import Ui_MainWindow


class mensaje(QMainWindow):
 def __init__(self, parent=None):
     super(mensaje, self).__init__(parent)
     self.mensaje = Ui_MainWindow()
     self.mensaje.setupUi(self)
     self.mensaje.pushButton_2.clicked.connect(self.typetext)

 def typetext(self):
     t = "hello world"
     a = ""
     for i in t:
         a = a + i
         self.mensaje.texto.setText(a)
         sleep(0.5)
if __name__ == "__main__":
 app = QApplication(sys.argv)
 app.setQuitOnLastWindowClosed(True)
 myapp = mensaje()
 myapp.show()
 sys.exit(app.exec_())

您必须使用 QTimer(不是 time.sleep)实现每 T 秒获取每个字母的逻辑并插入文本,您不应替换所有文本:

import sys

from PySide2.QtCore import QObject, QTimer, Signal
from PySide2.QtWidgets import QApplication, QMainWindow

from mensaje import Ui_MainWindow


class Producer(QObject):
    letterChanged = Signal(str)

    def __init__(self, parent=None):
        super(Producer, self).__init__(parent)

        self._text = ""
        self._text_it = None
        self._timer = QTimer(self, timeout=self._handle_timeout)

    @property
    def text(self):
        return self._text

    @text.setter
    def text(self, text):
        self._text = text

    def start(self, interval=1000):
        self._text_it = iter(self.text)
        self._timer.start(interval)
        self._handle_timeout()

    def stop(self):
        self._timer.stop()
        self._text_it = None

    def _handle_timeout(self):
        try:
            letter = next(self._text_it)
        except StopIteration as e:
            self._timer.stop()
        else:
            self.letterChanged.emit(letter)


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.mensaje = Ui_MainWindow()
        self.mensaje.setupUi(self)

        self.producer = Producer()
        self.producer.text = "hello world"

        self.producer.letterChanged.connect(self.mensaje.texto.insert)
        self.mensaje.pushButton_2.clicked.connect(self.handle_clicked)

    def handle_clicked(self):
        self.producer.start(500)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(True)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())