簡體   English   中英

“QThread:當線程仍在運行時被破壞”從Windows cmd或IDLE運行但不是從PyCharm運行?

[英]“QThread: Destroyed while thread is still running” when run from the Windows cmd or IDLE but not from PyCharm?

這是使用QObject.moveToThread實現PyQt多線程的程序的簡化版本。 基本上,我在一個單獨的線程上查詢網頁並提取HMTL內容。

我遇到這個問題,從IDLE運行代碼或Windows命令行掛起python。 Windows cmd顯示“QThread:在線程仍在運行時被銷毀”。 但是,如果我從Pycharm運行它,一切正常。

你可以在這里獲得.ui文件

有任何想法嗎?

import requests
import sys
from PyQt4 import QtGui, uic
from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal, QThread


qtCreatorFile = "window.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)


class HttpClient(QObject):

    finished =  pyqtSignal(str)

    def __init__(self):
        QObject.__init__(self)

    @pyqtSlot()
    def retrieve_page(self, url):
        response = requests.get(url)
        self.finished.emit(response.text)


class HtmlGetter(QtGui.QMainWindow, Ui_MainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)       
        self.go_button.clicked.connect(self.query_page)

    def query_page(self):
        http_client = HttpClient()
        temp_thread = QThread()
        http_client.moveToThread(temp_thread)

        temp_thread.started.connect(
        lambda: http_client.retrieve_page("http://www.google.com/"))
        http_client.finished.connect(self.show_html)

        # Terminating thread gracefully.
        http_client.finished.connect(temp_thread.quit)
        http_client.finished.connect(http_client.deleteLater)
        temp_thread.finished.connect(temp_thread.deleteLater)

        temp_thread.start()

    def show_html(self, html_text):
        print(html_text)


def main():
    app = QtGui.QApplication(sys.argv)
    window = HtmlGetter()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我想到了:

http_client和temp_thread都必須是屬性或HtmlGetter類。 我認為這是因為否則python在退出函數時會丟棄它們。 這是工作代碼:

import requests
import sys
from PyQt4 import QtGui, uic
from PyQt4.QtCore import QObject, pyqtSlot, pyqtSignal, QThread


qtCreatorFile = "window.ui"
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)


class HttpClient(QObject):

    finished =  pyqtSignal()
    send_text = pyqtSignal(str)

    def __init__(self):
        QObject.__init__(self)

    @pyqtSlot()
    def retrieve_page(self, url):
        response = requests.get(url)
        self.send_text.emit(response.text)
        self.finished.emit()


class HtmlGetter(QtGui.QMainWindow, Ui_MainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)       
        self.go_button.clicked.connect(self.query_page)

    def query_page(self):
        self.http_client = HttpClient()
        self.temp_thread = QThread()
        self.http_client.moveToThread(self.temp_thread)

        self.temp_thread.started.connect(
        lambda: self.http_client.retrieve_page("http://www.google.com/"))
        self.http_client.send_text.connect(self.show_html)

        # Terminating thread gracefully.
        self.http_client.finished.connect(self.temp_thread.quit)
        self.http_client.finished.connect(self.http_client.deleteLater)
        self.temp_thread.finished.connect(self.temp_thread.deleteLater)

        self.temp_thread.start()

    def show_html(self, html_text):
        print(html_text)


def main():
    app = QtGui.QApplication(sys.argv)
    window = HtmlGetter()
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM