为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2021-06-19 16:40:10
我正在构建一个在会话启动时执行文件操作的小工具。为了确保用户有视觉反馈,我想将它与进度条相关联。到目前为止,我在这里:import sysimport timefrom 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。不用说,我是初学者。有没有人有想法?干杯
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

每个 GUI 都存在于一个事件循环中,它允许您处理用户、操作系统等的事件,例如鼠标、键盘等,因此如果您阻止此处理,GUI 将不会更新其状态,在您的情况下问题是由time.sleep(),阻塞,阻止 GUI 激活显示窗口的状态引起的。所以作为一个基本规则:不要time.sleep()在 GUI 的主线程内使用,我想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()


查看完整回答
反对 回复 2021-06-22
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信