Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关闭QtGui窗口的步骤_Python_Multithreading_Pyqt - Fatal编程技术网

Python 关闭QtGui窗口的步骤

Python 关闭QtGui窗口的步骤,python,multithreading,pyqt,Python,Multithreading,Pyqt,我是python的初学者。最近我遇到了一个问题。问题说明如下:我需要在我的应用程序中使用progressbar。所以我在谷歌上找到了一个类似的代码。使用此代码,即使进度为100%,主窗口也不会关闭(当进度窗口关闭时)。 请帮我解决这个问题 搜索后,我发现以下代码: from threading import * import sys import time from PyQt4 import QtGui from PyQt4 import QtCore class QCustomThread (

我是python的初学者。最近我遇到了一个问题。问题说明如下:我需要在我的应用程序中使用progressbar。所以我在谷歌上找到了一个类似的代码。使用此代码,即使进度为100%,主窗口也不会关闭(当进度窗口关闭时)。 请帮我解决这个问题

搜索后,我发现以下代码:

from threading import *
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore
class QCustomThread (QtCore.QThread):
    startLoad    = QtCore.pyqtSignal(int)
    progressLoad = QtCore.pyqtSignal(int)
    statusLoad   = QtCore.pyqtSignal(bool)
    def __init__ (self, parentQWidget = None):
        super(QCustomThread, self).__init__(parentQWidget)
        self.wasCanceled = False
    def run (self):
        # Simulate data load estimation
        numberOfprogress = 100
        self.startLoad.emit(numberOfprogress)
        for progress in range(numberOfprogress + 1):
            # Delay
            time.sleep(0.1)
            if not self.wasCanceled:
                self.progressLoad.emit(progress)
            else:
                break
        self.statusLoad.emit(True if progress == numberOfprogress else False)
        self.exit(0)
    def cancel (self):
        self.wasCanceled = True
class QCustomMainWindow (QtGui.QMainWindow):
    def __init__ (self):
        super(QCustomMainWindow, self).__init__()        
        self.loadingQProgressDialog = QtGui.QProgressDialog(self)
        self.loadingQProgressDialog.setLabelText('Processing')
        self.loadingQProgressDialog.setCancelButtonText('Cancel')
        self.loadingQProgressDialog.setWindowModality(QtCore.Qt.WindowModal)
        self.startWork()
    def startWork (self):
        myQCustomThread = QCustomThread(self)
        def startLoadCallBack (numberOfprogress):
            self.loadingQProgressDialog.setMinimum(0)
            self.loadingQProgressDialog.setMaximum(numberOfprogress)
            self.loadingQProgressDialog.show()
        def progressLoadCallBack (progress):
            self.loadingQProgressDialog.setValue(progress)
        def statusLoadCallBack (flag):
            print 'SUCCESSFUL' if flag else 'FAILED'
        myQCustomThread.startLoad.connect(startLoadCallBack)
        myQCustomThread.progressLoad.connect(progressLoadCallBack)
        myQCustomThread.statusLoad.connect(statusLoadCallBack)
        self.loadingQProgressDialog.canceled.connect(myQCustomThread.cancel)
        myQCustomThread.start()
        self.loadingQProgressDialog.hide()
def app():
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomMainWindow = QCustomMainWindow()
    myQCustomMainWindow.show()
    print 'main complete'
##    myQCustomMainWindow.loadingQProgressDialog.hide()
    (myQApplication.exec_())
def deep():
    print 'hello'
    app()
    print 'hi'
if __name__=="__main__":
    deep()
    deep()
您找到了我的进度条;)。但我的答案是展示如何实现
QThread
打开文件,直到100%的进度才关闭窗口。但简单的关闭是,当进度成功时,在
def statusLoadCallBack(flag)
中使用关闭它


谢谢你的回复。这很有帮助。请告诉我们如何从函数应用程序将值(变量)传递给:class QCustomThread。请尝试阅读链接中的文档。任何语言都一样。
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore

class QCustomThread (QtCore.QThread):
    startLoad    = QtCore.pyqtSignal(int)
    progressLoad = QtCore.pyqtSignal(int)
    statusLoad   = QtCore.pyqtSignal(bool)

    def __init__ (self, parentQWidget = None):
        super(QCustomThread, self).__init__(parentQWidget)
        self.wasCanceled = False

    def run (self):
        # Simulate data load estimation
        numberOfprogress = 100
        self.startLoad.emit(numberOfprogress)
        for progress in range(numberOfprogress + 1):
            # Delay
            time.sleep(0.001)
            if not self.wasCanceled:
                self.progressLoad.emit(progress)
            else:
                break
        self.statusLoad.emit(True if progress == numberOfprogress else False)
        self.exit(0)

    def cancel (self):
        self.wasCanceled = True

class QCustomMainWindow (QtGui.QMainWindow):
    def __init__ (self):
        super(QCustomMainWindow, self).__init__()        
        self.loadingQProgressDialog = QtGui.QProgressDialog(self)
        self.loadingQProgressDialog.setLabelText('Processing')
        self.loadingQProgressDialog.setCancelButtonText('Cancel')
        self.loadingQProgressDialog.setWindowModality(QtCore.Qt.WindowModal)
        self.startWork()

    def startWork (self):
        myQCustomThread = QCustomThread(self)
        def startLoadCallBack (numberOfprogress):
            self.loadingQProgressDialog.setMinimum(0)
            self.loadingQProgressDialog.setMaximum(numberOfprogress)
            self.loadingQProgressDialog.show()
        def progressLoadCallBack (progress):
            self.loadingQProgressDialog.setValue(progress)
        def statusLoadCallBack (flag):
            print 'SUCCESSFUL' if flag else 'FAILED'
            if flag:
                self.close()
        myQCustomThread.startLoad.connect(startLoadCallBack)
        myQCustomThread.progressLoad.connect(progressLoadCallBack)
        myQCustomThread.statusLoad.connect(statusLoadCallBack)
        self.loadingQProgressDialog.canceled.connect(myQCustomThread.cancel)
        myQCustomThread.start()

def app():
    myQApplication = QtGui.QApplication(sys.argv)
    myQCustomMainWindow = QCustomMainWindow()
    myQCustomMainWindow.show()
    print 'main complete'
    (myQApplication.exec_())

def deep():
    print 'hello'
    app()
    print 'hi'

if __name__=="__main__":
    deep()
    deep()