PySide / PyQt:在GUI加载后执行功能

时间:2018-09-20 17:34:22

标签: python python-2.7 pyside

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

我到此为止:

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,以便更新它。

根据this,它与exec_ main循环有关,但是显然有些地方我不理解,因为我在my_operations之后调用show

不用说,我是一个初学者。有人有主意吗? 干杯

1 个答案:

答案 0 :(得分:0)

每个GUI都存在一个事件循环中,该循环允许您处理用户,操作系统等事件,例如鼠标,键盘等,因此,如果阻止此处理,GUI将不会更新其状态,在您的情况下,此问题是由time.sleep()引起的,该time.sleep()被阻止,导致GUI无法激活显示窗口的状态。因此,作为一个基本规则:不要在GUI的主线程内使用time.sleep(),我想threading.Thread()模拟一个需要一定时间的任务,在这种情况下,您必须从另一个线程执行此任务如果要更新GUI,则必须通过信号来进行,而不应该直接进行。

在下面的示例中,我将使用import sys import time import threading from PySide import QtCore, QtGui class 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() 创建一个新线程,并使用一个信号来更新GUI:

npm-giftedChat