gpt4 book ai didi

python - 更新多线程 PyQT 中的 GUI 元素

转载 作者:IT老高 更新时间:2023-10-28 21:08:58 26 4
gpt4 key购买 nike

我研究了一段时间以查找信息如何使用 PyQT 进行多线程程序,更新 GUI 以显示结果

我习惯于通过示例学习,但我找不到(是的,我一直在寻找几周)任何使用多线程执行简单任务的程序示例,例如连接到 www 站点列表(5 个线程)和只是打印带有响应代码的处理过的网址。

任何人都可以分享代码或将我发送到解释此类程序的好教程吗?

最佳答案

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

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

import sys
import urllib2

from PyQt4 import QtCore, QtGui


class 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('%s\n%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 documentation)。如本答案的第二部分所示,使用线程的正确方法是通过信号/插槽。


此外,您可以使用信号和插槽来分离 gui 和网络逻辑。

import sys
import urllib2

from PyQt4 import QtCore, QtGui


class 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('%s\n%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(unicode(data))


if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())

关于python - 更新多线程 PyQT 中的 GUI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com