본문 바로가기
파이썬

파이썬 MultiThreaded PyQT에서 GUI 요소 업데이트

by º기록 2020. 9. 16.
반응형

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

 

 

반응형

댓글