PySide / PyQt的:GUI加载后执行功能(PySide/PyQt: Execute fun

2019-09-28 03:56发布

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

在这里,我至今:

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_operationsshow

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

Answer 1:

每个GUI住在一个事件循环,使您可以处理用户,操作系统等的事件,如鼠标,键盘等,所以如果你阻断这种处理的图形用户界面将不会更新其状态,你的情况该问题是由引起time.sleep()其被阻挡,从而防止从GUI激活显示窗口的状态。 因此,作为一个基本的规则:不要使用time.sleep()的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()


文章来源: PySide/PyQt: Execute functions after GUI loads