PyQt 运行时问题

5
我希望我的代码能够通过展示qtwidget然后运行forloop来运行,但它先运行了forloop,然后才向我展示我的widget。为什么会这样?
class tes(QWidget):

    def __init__(self):
        super(tes, self).__init__()
        self.initUI()
        for i in range (1000000):
            print("s")

    def initUI(self):
        t = QTableWidget(8,8,self)        
        self.show()
        self.resize(1000,1000)
        t.setGeometry(0,0,500,500)
        t.show()

def main():
    app = QApplication(sys.argv)
    t = tes()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

这是因为“显示”发生在app.exec_()行中(即主循环开始时)。我猜你需要澄清你真正想做什么。 - Avaris
3个回答

14

在循环之前添加QApplication.processEvents()。这样可以显示您的窗口,但无法响应用户操作。为使应用程序响应用户操作,可以在循环的某些步骤中添加processEvents()调用。

例如:

def __init__(self):
    super(tes, self).__init__()
    self.initUI()
    QApplication.processEvents()
    for i in range (1000000):
        if not i % 3:  # let application process events each 3 steps.
            QApplication.processEvents()
        print("s")

2
更具体地说,当您调用 self.initUI() 时,正在生成的事件(例如showEvent)被排入事件队列中,但事件循环尚未开始。当您调用 processEvents() 时,您正在强制手动清除队列。 - jdi
谢谢,这帮助我重新控制GUI。但现在我不知道如何继续从我正在切换到GUI的线程。 - Ben

0

这是因为在tes对象初始化期间,for循环执行后你运行了app.exec_()


0
小部件只有在应用程序运行时才会显示,而不是在初始化时显示。您在循环中究竟想要做什么?将其连接到信号或在事件中处理可能更好,但这完全取决于您想要实现什么目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接