반응형
PyQT를 사용하여 다중 스레드 프로그램을 수행하는 방법, 결과를 표시하도록 GUI를 업데이트하는 방법 정보를 찾기 위해 얼마 동안 연구 중이었습니다.
나는 예를 들어 배우는 데 익숙하며 예를 들어 www 사이트 목록 (5 스레드)에 연결하고 인쇄 처리와 같은 간단한 작업을 수행하는 멀티 스레딩을 사용하는 프로그램의 간단한 예를 찾을 수 없습니다 (예, 몇 주를 찾고있었습니다) 응답 코드가있는 URL.
누구든지 코드를 공유하거나 그러한 프로그램이 설명 된 좋은 튜토리얼로 저를 보낼 수 있습니까?
해결 방법
여기에 아주 기본적인 예가 있습니다.
<스트라이크> 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_())
또한 신호와 슬롯을 사용하여 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_())
참조 페이지 https://stackoverflow.com/questions/9957195
반응형
'파이썬' 카테고리의 다른 글
파이썬 정규식에서 시작과 끝을 어떻게 일치시킬 수 있습니까? (0) | 2020.09.16 |
---|---|
파이썬 pip를 사용하여 한 번에 여러 Python 패키지를 설치하는 방법 (0) | 2020.09.16 |
파이썬 numpy의 요소 별 문자열 연결 (0) | 2020.09.16 |
파이썬 자르지 않고 int 배열을 numpy의 문자열 배열로 변환 (0) | 2020.09.15 |
파이썬 키를 누르고있을 때 어떻게 스프라이트를 움직일 수 있습니까? (0) | 2020.09.15 |
댓글