PySide/PyQt:在 GUI 加载后执行函数

我正在构建一个在会话启动时执行文件操作的小工具。为了确保用户有视觉反馈,我想将它与进度条相关联。


到目前为止,我在这里:


import sys

import time

from PySide.QtGui import *



class ProgressWindowWidget(QWidget):

    def __init__(self, parent=None):

        super(ProgressWindowWidget, self).__init__()


        self.init_ui()


    def init_ui(self):

        self.setGeometry(500, 500, 600, 100)

        self.setWindowTitle('Progress')


        self.layout_ = QGridLayout()

        self.setLayout(self.layout_)


        self.progress_bar = QProgressBar()

        self.layout_.addWidget(self.progress_bar, 0, 0, 1, 1)


    def my_operations(self):

        print('do something 1')

        time.sleep(2)

        print('do something 2')

        time.sleep(2)

        print('do something 3')

        time.sleep(2)



def main():

    app = QApplication(sys.argv)

    progress_window = ProgressWindowWidget()

    progress_window.show()

    progress_window.my_operations()

    sys.exit(app.exec_())



if __name__ == '__main__':

    main()

我的问题是my_operations先执行然后加载我的 GUI。我my_operations只想在加载进度条时执行,以便我可以更新它。


根据这个,它有事情做与exec_ main循环,但显然一些事情,因为我打电话,我不明白这里my_operations后show。


不用说,我是初学者。有没有人有想法?干杯


浮云间
浏览 223回答 1
1回答

开满天机

每个 GUI 都存在于一个事件循环中,它允许您处理用户、操作系统等的事件,例如鼠标、键盘等,因此如果您阻止此处理,GUI 将不会更新其状态,在您的情况下问题是由time.sleep(),阻塞,阻止 GUI 激活显示窗口的状态引起的。所以作为一个基本规则:不要time.sleep()在 GUI 的主线程内使用,我想time.sleep()模拟一个需要一定时间的任务,在这种情况下,你必须从另一个线程执行这个任务,如果你想更新 GUI,你必须这样做它通过信号的方式,不应该直接完成。在下面的示例中,我将使用threading.Thread()创建一个新线程和一个信号来更新 GUI:import sysimport timeimport threadingfrom PySide import QtCore, QtGuiclass ProgressWindowWidget(QtGui.QWidget):    progressSignal = QtCore.Signal(int)    def __init__(self, parent=None):        super(ProgressWindowWidget, self).__init__()        self.init_ui()    def init_ui(self):        self.setGeometry(500, 500, 600, 100)        self.setWindowTitle('Progress')        self.layout_ = QtGui.QGridLayout()        self.setLayout(self.layout_)        self.progress_bar = QtGui.QProgressBar()        self.progressSignal.connect(self.progress_bar.setValue)        self.layout_.addWidget(self.progress_bar, 0, 0, 1, 1)    def my_operations(self):        print('do something 1')        time.sleep(2)        self.progressSignal.emit(33)        print('do something 2')        time.sleep(2)        self.progressSignal.emit(66)        print('do something 3')        time.sleep(2)        self.progressSignal.emit(100)def main():    app = QtGui.QApplication(sys.argv)    progress_window = ProgressWindowWidget()    progress_window.show()    t = threading.Thread(target=progress_window.my_operations)    t.start()    sys.exit(app.exec_())if __name__ == '__main__':    main()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python