使用pyqt的正确方法是什么?

2024-10-02 08:26:58 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码给出错误消息: “QObject::startTimer:无法从其他线程启动计时器。” 我真的不明白为什么。主要是因为我几乎得到了这个线程问题和信号和插槽机制。如何将“int(percent)”变量传递到对话框或主GUI的对话框,以获得progressbar对象的实时刷新?在

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
import urllib.request

class Main(QWidget):
    def __init__(self, parent = None):
        super(Main, self).__init__()
        self.label = QLabel("TheMainGUI")
        self.pushbutton = QPushButton("Download")

        layout = QHBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.pushbutton)
        self.setLayout(layout)

        self.pushbutton.clicked.connect(self.download)

    def download(self):
        self.filedownloadthread = FileDownloadThread()
        self.filedownloadthread.start()

class Dialog(QDialog):
    def __init__(self, parent = None):
        super(Dialog, self).__init__()
        self.progbar = QProgressBar()
        layout = QVBoxLayout()
        layout.addWidget(self.progbar)
        self.setLayout(layout)

class FileDownloadThread(QThread):
    def __init__(self):
        super(FileDownloadThread, self).__init__()
        self.dialog = Dialog()
        self.dialog.show()

    def run(self):
        url = "http://mysource.net//myfile"
        outputfile = "d://file//path//etc//myfile"

        def reporthook(blocknum, blocksize, totalsize):
            readsofar = blocknum * blocksize
            if totalsize > 0:
                percent = readsofar * 1e2 / totalsize

                self.dialog.progbar.setValue(int(percent))
                s = "\r%5.1f%% %*d / %d" % (
                    percent, len(str(totalsize)), readsofar, totalsize)
                sys.stderr.write(s)
                if readsofar >= totalsize:
                    sys.stderr.write("\n")
            else:
                sys.stderr.write("read %d\n" % (readsofar,))

        proxy = urllib.request.ProxyHandler({'http': "myproxy"})
        opener = urllib.request.build_opener(proxy)
        urllib.request.install_opener(opener)
        urllib.request.urlretrieve(url, outputfile, reporthook)

app = QApplication(sys.argv)
form = Main()
form.show()
app.exec_()

Tags: importselfinitmainrequestdefsysopener
1条回答
网友
1楼 · 发布于 2024-10-02 08:26:58

它使用旧的信号和插槽机制工作得很好。在

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys
import urllib.request

class Main(QWidget):
    def __init__(self, parent = None):
        super(Main, self).__init__()
        self.label = QLabel("TheMainGUI")
        self.pushbutton = QPushButton("Download")

        layout = QHBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.pushbutton)
        self.setLayout(layout)

        self.pushbutton.clicked.connect(self.download)

    def download(self):
        self.dialog = Dialog()
        self.dialog.show()

class Dialog(QDialog):
    def __init__(self, parent = None):
        super(Dialog, self).__init__()
        self.progbar = QProgressBar()
        layout = QVBoxLayout()
        layout.addWidget(self.progbar)
        self.setLayout(layout)

        self.filedownloadthread = FileDownloadThread()
        self.connect(self.filedownloadthread, SIGNAL('signal'), self.update)
        self.filedownloadthread.start()

    def update(self, percent):
        self.progbar.setValue(percent)

class FileDownloadThread(QThread):
    def __init__(self):
        super(FileDownloadThread, self).__init__()

    def run(self):
        url = "http://mysource.net//myfile"
        outputfile = "d://file//path//etc//myfile"

        def reporthook(blocknum, blocksize, totalsize):
            readsofar = blocknum * blocksize
            if totalsize > 0:
                percent = readsofar * 1e2 / totalsize

                self.dialog.progbar.setValue(int(percent))
                s = "\r%5.1f%% %*d / %d" % (
                    percent, len(str(totalsize)), readsofar, totalsize)
                sys.stderr.write(s)
                if readsofar >= totalsize:
                    sys.stderr.write("\n")
            else:
                sys.stderr.write("read %d\n" % (readsofar,))
            self.emit(SIGNAL('signal'), int(percent))

        proxy = urllib.request.ProxyHandler({'http': "myproxy"})
        opener = urllib.request.build_opener(proxy)
        urllib.request.install_opener(opener)
        urllib.request.urlretrieve(url, outputfile, reporthook)

app = QApplication(sys.argv)
form = Main()
form.show()
app.exec_()

相关问题 更多 >

    热门问题