Search code examples
pythontextpyqt4qlineedit

PyQt: Set text in a QLabel adding letter by letter


I'm trying to create an application that displays the contents of a QLabel (or a QTextEdit) by adding the letters one by one (as if the application were writing them).

This is an example in python:

import os, time

def write(text, time):
    base = ""
    for char in text:
        os.system("clear")
        base += char
        print base
        time.sleep(time)

def main():
    text = "this is a test"
    write(text, 0.05)

This is my PyQt code:

from PyQt4 import QtCore, QtGui
import sys

class Example(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.initUi()

        text = "this is a test"
        self.write(text, 50)

    def initUi(self):
        self.setGeometry(300, 300, 250, 150) 
        self.show()

        self.label = QtGui.QLabel(self)
        self.label.move(120, 60)

    def write(self, text, msec):
        base = ""
        for char in text:
            base += char
            self.label.setText(base)
            QtCore.QThread.msleep(msec)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())

This code, obviously, doesn't work - but I have no idea how to do this "simple" thing.


Solution

  • You can use QTimer to do this:

    import sys
    from PyQt4 import QtCore, QtGui
    
    class Example(QtGui.QWidget):
        def __init__(self):
            QtGui.QWidget.__init__(self)
            self.label = QtGui.QLabel(self)
            layout = QtGui.QVBoxLayout(self)
            layout.addWidget(self.label)
            self._text = 'this is a test'
            self._index = 0
            self.timer = QtCore.QTimer(self)
            self.timer.timeout.connect(self.handleTimer)
            self.timer.start(200)
    
        def handleTimer(self):
            self._index += 1
            self.label.setText(self._text[:self._index])
            if self._index > len(self._text):
                self.timer.stop()
    
    if __name__ == '__main__':
    
        app = QtGui.QApplication(sys.argv)
        ex = Example()
        ex.setGeometry(300, 300, 250, 150)
        ex.show()
        sys.exit(app.exec_())