Dies ist eine vereinfachte Version des Programms, das PyQt Multithreading mit QObject.moveToThread implementiert. Grundsätzlich frage ich eine Webseite in einem separaten Thread ab und extrahiere den HMTL-Inhalt."QThread: Zerstört, während der Thread noch läuft" bei der Ausführung von Windows-Cmd oder IDLE, aber nicht von PyCharm?
Ich bekomme dieses Problem, wenn der Code von IDLE oder der Windows-Befehlszeile hängt Python. Der Windows-Cmd zeigt "QThread: Zerstört, während der Thread noch läuft". Wenn ich es jedoch von PYCHARM aus starte, funktioniert alles einwandfrei.
Sie können die .ui Datei here
Irgendwelche Ideen?
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()
Ich bekomme dieses Problem auch immer dann, wenn ich Multithread-Programme unter Windows ausführe, vor allem, wenn ich versuche, es mit Ctrl-C zu beenden. –