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