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_())
我有以下程序,但事实证明,当它必须传递文本时,程序卡住了,无法逐个字母地显示
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_())