栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 面试经验 > 面试问答

在多线程PyQT中更新GUI元素

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在多线程PyQT中更新GUI元素

这里有一些非常基本的例子。

您可以将对GUI元素的引用传递给线程,并在线程中更新它们。

import sysimport urllib2from PyQt4 import QtCore, QtGuiclass DownloadThread(QtCore.QThread):    def __init__(self, url, list_widget):        QtCore.QThread.__init__(self)        self.url = url        self.list_widget = list_widget    def run(self):        info = urllib2.urlopen(self.url).info()        self.list_widget.addItem('%sn%s' % (self.url, info))class MainWindow(QtGui.QWidget):    def __init__(self):        super(MainWindow, self).__init__()        self.list_widget = QtGui.QListWidget()        self.button = QtGui.QPushButton("Start")        self.button.clicked.connect(self.start_download)        layout = QtGui.QVBoxLayout()        layout.addWidget(self.button)        layout.addWidget(self.list_widget)        self.setLayout(layout)    def start_download(self):        urls = ['http://google.com', 'http://twitter.com', 'http://yandex.ru',     'http://stackoverflow.com/', 'http://www.youtube.com/']        self.threads = []        for url in urls: downloader = DownloadThread(url, self.list_widget) self.threads.append(downloader) downloader.start()if __name__ == "__main__":    app = QtGui.QApplication(sys.argv)    window = MainWindow()    window.resize(640, 480)    window.show()    sys.exit(app.exec_())

编辑者注意:
Qt小部件不是线程安全的,不应从任何线程(主线程)进行访问(有关更多详细信息,请参见Qt文档)。正确使用线程的方法是通过信号/插槽,如答案第二部分所示。


另外,您可以使用信号和插槽来分隔GUI和网络逻辑。

import sysimport urllib2from PyQt4 import QtCore, QtGuiclass DownloadThread(QtCore.QThread):    data_downloaded = QtCore.pyqtSignal(object)    def __init__(self, url):        QtCore.QThread.__init__(self)        self.url = url    def run(self):        info = urllib2.urlopen(self.url).info()        self.data_downloaded.emit('%sn%s' % (self.url, info))class MainWindow(QtGui.QWidget):    def __init__(self):        super(MainWindow, self).__init__()        self.list_widget = QtGui.QListWidget()        self.button = QtGui.QPushButton("Start")        self.button.clicked.connect(self.start_download)        layout = QtGui.QVBoxLayout()        layout.addWidget(self.button)        layout.addWidget(self.list_widget)        self.setLayout(layout)    def start_download(self):        urls = ['http://google.com', 'http://twitter.com', 'http://yandex.ru',     'http://stackoverflow.com/', 'http://www.youtube.com/']        self.threads = []        for url in urls: downloader = DownloadThread(url) downloader.data_downloaded.connect(self.on_data_ready) self.threads.append(downloader) downloader.start()    def on_data_ready(self, data):        print data        self.list_widget.addItem(unipre(data))if __name__ == "__main__":    app = QtGui.QApplication(sys.argv)    window = MainWindow()    window.resize(640, 480)    window.show()    sys.exit(app.exec_())


转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/639951.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号