यहां कुछ बहुत ही बुनियादी उदाहरण हैं।
आप जीयूआई तत्वों के धागे के संदर्भों को संदर्भित कर सकते हैं, और उन्हें थ्रेड में अपडेट कर सकते हैं।
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 documentation देखें) तक पहुँच नहीं किया जाना चाहिए। धागे का उपयोग करने का सही तरीका सिग्नल/स्लॉट के माध्यम से होता है क्योंकि इस उत्तर के दूसरे भाग से पता चलता है।
इसके अलावा, आप संकेतों और स्लॉटों का इस्तेमाल कर सकते हैं, जीयूआई और नेटवर्क तर्क अलग करने के लिए।
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_())
अरे, मैंने pyqt की कोशिश नहीं की है, लेकिन मैंने pygtk में multithreading का उपयोग किया है। Pygtk में, gobject आमतौर पर ऐसा करने के लिए प्रयोग किया जाता है। आपको पीईक्यूटी के लिए कुछ इसी तरह की खोज करनी चाहिए। – Froyo
यह भी देखें http://stackoverflow.com/questions/11265812/pyside-pyqt-starting-a-cpu-intensive-thread-hangs-the-whole- appplication, http://stackoverflow.com/questions/16879971/example -ऑफ-द-राइट-वे-टू-यूज-क्विड्रेड-इन-पिक्ट, http://stackoverflow.com/questions/6783194/background-thread-with-qthread-in-pyqt या http://stackoverflow.com/प्रश्न/20752154/pyqt-connecting-a-signal-to-a-slot-to-start-a-background-operation – Trilarion