代码之家  ›  专栏  ›  技术社区  ›  JustPy

python qt pyside列表框逐行打印

  •  0
  • JustPy  · 技术社区  · 7 年前

    这段代码(python3/Qt/PySide)是在完成某项工作后,在列表框(或其他地方)中逐行打印的。问题是打印完成后,行不会刷新。请给我一些智慧。

    import sys
    from random import randint
    from PySide import QtGui, QtCore
    import time
    
    def do_job ():
        time.sleep(randint(1, 8)/10.0)
    
    def work():
        for i in range(14):
            do_job ()
            line = QtGui.QListWidgetItem("did job {}".format(i))
            print (line.text())
            w.lw.addItem(line)
    
    app = QtGui.QApplication(sys.argv)
    w = QtGui.QWidget()
    w.setGeometry(300, 300, 420, 240)
    w.setWindowTitle('Some task')
    
    w.btn1 = QtGui.QPushButton('do job', w)
    w.btn1.move(300, 120)
    w.btn1.clicked.connect(work)
    
    w.btn2 = QtGui.QPushButton('die', w)
    w.btn2.move(300, 180)
    w.btn2.clicked.connect(QtCore.QCoreApplication.instance().quit)
    
    w.lw = QtGui.QListWidget(w)
    w.lw.move(20, 20)
    
    w.show()
    sys.exit(app.exec_())
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   eyllanesc Yonghwan Shin    7 年前

    功能如下 sleep() 阻止GUI循环,使其无法更新所管理的元素,此外,还要注意在加载时不能与GUI交互,例如更改其大小。您应该做的是寻找一些等效的,对于Qt,您可以 QEventLoop 用一个 QTimer :

    def do_job():
        loop = QtCore.QEventLoop()
        QtCore.QTimer.singleShot(100*randint(1, 8), loop.quit)
        loop.exec_()
    

    以下方法等效于 time.sleep(delay) :

    def new_sleep(delay):
        loop = QtCore.QEventLoop()
        QtCore.QTimer.singleShot(int(delay*1000), loop.quit)
        loop.exec_()