Python 将字符串传递给QThread并输出

Python 将字符串传递给QThread并输出,python,python-3.x,python-3.5,pyqt5,Python,Python 3.x,Python 3.5,Pyqt5,这段代码只是使用Google站点的一个示例,但我希望它适用于任何支持JavaScript的站点。所以,我有:QPushButton对象,它连接到getAnswer函数,该函数将输入的文本获取到QLineEdit对象,并(应该)将其传递给QThread,在这里,该文本应该用于搜索(text)函数。之后,结果文本应显示在QLabel对象中。问题是:如何将此字符串传递给QThread并输出结果字符串? 下面的代码预计会崩溃 self.get_thread = getGoogle(self.text)

这段代码只是使用Google站点的一个示例,但我希望它适用于任何支持JavaScript的站点。所以,我有:QPushButton对象,它连接到getAnswer函数,该函数将输入的文本获取到QLineEdit对象,并(应该)将其传递给QThread,在这里,该文本应该用于搜索(text)函数。之后,结果文本应显示在QLabel对象中。问题是:如何将此字符串传递给QThread并输出结果字符串? 下面的代码预计会崩溃

self.get_thread = getGoogle(self.text)
这是错误的

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
from bs4 import BeautifulSoup
from PyQt5.QtWidgets import QApplication, QWidget, \
    QLabel, QLineEdit, QGridLayout, QPushButton
from PyQt5.QtCore import pyqtSignal, QEventLoop, QThread
from PyQt5.QtWebEngineWidgets import QWebEngineView
from requests import get


class getGoogle(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.text=text

    def __del__(self):
        self.wait()

    def render(source_html):
        class Render(QWebEngineView):
            def __init__(self, html):
                self.html = None
                self.app = QApplication([])
                QWebEngineView.__init__(self)
                self.loadFinished.connect(self._loadFinished)
                self.setHtml(html)
                while self.html is None:
                    self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents)
                self.app.quit()

            def _callable(self, data):
                self.html = data

            def _loadFinished(self):
                self.page().toHtml(self._callable)

        return Render(source_html).html

    def search(self, text):
        query=str(text)
        query = query.replace(" ", "+")
        url='https://www.google.com/search?q=' + query
        headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
        sample_html = get(url, headers=headers).text
        soup = BeautifulSoup(self.render(sample_html), "html.parser")
        res = soup.find('span', attrs={'class': 'cwcot'})
        res = res.get_text()
        return res

    def run(self):
        result=self.search(text)
        self.emit(pyqtSignal('add_answer(QString)'), result)
        self.sleep(2)


class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.sendButton = QPushButton('Ask', self)
        self.questionEdit = QLineEdit(self)
        self.answer=QLabel(self)
        grid = QGridLayout(self)
        grid.setSpacing(10)
        grid.addWidget(self.questionEdit, 1, 0)
        grid.addWidget(self.sendButton, 1, 1)
        grid.addWidget(self.answer, 2,0)
        self.sendButton.clicked.connect(self.getAnswer)
        self.setLayout(grid)
        self.resize(500, 100)
        self.show()

    def getAnswer(self):
        text = self.questionEdit.text()
        if len(text)>=1:
            self.get_thread = getGoogle(self.text)
            self.connect(self.get_thread, pyqtSignal("add_answer(QString)"), self.answer.setText)
            self.get_thread.start()
        else:
            self.answer.setText("Specify your question")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    my = MyApp()
    sys.exit(app.exec_())

Ypu将需要完全重构您的代码。您正在线程中构造新的QApplication(可能导致崩溃)。您正在线程中构造GUI对象(最终将导致崩溃)。你需要重写它,这样它就不会做这些事情。@three_Pinepples如果我在一个单独的文件中只使用render()和search()函数的代码,它工作得很好,即给出search()函数所需的结果。我知道两个QApplication-s不能同时运行,因此我希望在不同的线程中运行它们会有所帮助。这不是真的吗?问题是,我需要一个进程,该进程将从启用JavaScript的页面呈现结果html