Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 Qt(Gui)中的线程问题_Python_Qt_Pyqt_Qthread - Fatal编程技术网

Python Qt(Gui)中的线程问题

Python Qt(Gui)中的线程问题,python,qt,pyqt,qthread,Python,Qt,Pyqt,Qthread,我正在开发一个从互联网下载文件的应用程序。 我已经为此使用了Qt。 下载过程使用包含while循环的QThread对象在单独的线程中运行。 为了显示进度,我在主线程内有一个标签,并更新我向主线程发送的信号。 问题是,当下载线程开始并保持为0时,标签显示值0,下载完成后,标签突然显示为100。 没有中间值。 如何解决此问题 我已经使用了repaint()、processEvents()和update方法。它们不起作用 以下是一些代码供参考: 这是用于创建下载线程的类线程 class signal(

我正在开发一个从互联网下载文件的应用程序。 我已经为此使用了Qt。 下载过程使用包含while循环的QThread对象在单独的线程中运行。 为了显示进度,我在主线程内有一个标签,并更新我向主线程发送的信号。 问题是,当下载线程开始并保持为0时,标签显示值0,下载完成后,标签突然显示为100。 没有中间值。 如何解决此问题

我已经使用了
repaint()
processEvents()
update
方法。它们不起作用

以下是一些代码供参考:

这是用于创建下载线程的类线程

class signal(QObject):       #For creating signals
sgn=pyqtSignal()
ma=pyqtSignal()
jo=pyqtSignal()
def __init__(self):
    super(signal,self).__init__()

class thread(QThread):
    def __init__(self):
        super(thread,self).__init__()
        self.w=signal()
    def run(self):
        global url
        global video
        global val
        self.w.ma.emit()
        size=url.get_filesize()
        f=open(video.title+'.'+url.extension,"wb")
        resp=urllib.request.urlopen(url.url)
        l=0
        print(size)
        while True:
            buf=resp.read(65536)
            if not buf:
                f.close()
                return
            l+=len(buf)
            val=l//size*100     # val is global variable for progress value
            self.w.sgn.emit()   # Here I emit the signal
            f.write(buf)
线程对象和标签在主GUI线程中定义

用户按下下载按钮后,我启动线程

#Main thread
.
.
self.obj=thread()
self.obj.w.sgn.connect(self.m)
def m(self):     #Slot for updating
    global val
    print("Here")   #For checking
    self.label.setText(str(val))  

注意-“Here”会在控制台中反复打印,并在下载完成后停止。

显示您的代码这是一大块代码。只需包含相关代码(请参阅)。如何发出下载状态?您是否检查了中间进度是否有效发出?是。我已经检查过中间进程是通过在控制台上打印一些消息来传输的。所以这不是问题!