python - PySide/PyQt : Execute functions after GUI loads

标签 python python-2.7 pyside

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

到目前为止我在这里:

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 循环有关,但显然这里有一些我不明白的事情,因为我在 show 之后调用 my_operations .

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

最佳答案

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

在下面的示例中,我将使用 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()

关于python - PySide/PyQt : Execute functions after GUI loads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52430427/

相关文章:

python - PySide 可以与 Anaconda Python 3.5 一起使用吗?

qt - PySide:QTimer 需要 QApplication 才能工作吗?

python - 在不清除图形的情况下删除流图(matplotlib)

python - DatetimeIndex 对象中的日期列表

python - 为什么 python 设计为 str(None) 返回 'None' 而不是空字符串?

linux - 当我运行 cqlsh 命令时,Python Cassandra 驱动程序未安装或未安装在 PYTHONPATH 上

python - 自定义信号 Scrapy

python - 在 Python 中实现装饰器模式

python - 如何在 Python 中解析 iCal 日历文件的 CATEGORIES 组件

python - 如何使用QFileSystemModel过滤多个目录并显示在QTreeView上?