Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于处理PHP的异步python函数_Python_Asynchronous_Pyqt_Pyqt5 - Fatal编程技术网

用于处理PHP的异步python函数

用于处理PHP的异步python函数,python,asynchronous,pyqt,pyqt5,Python,Asynchronous,Pyqt,Pyqt5,我正在用pyqt5开发一个应用程序,它通过QtWebChannel作为一个web应用程序,当你点击带有html“Python”文本的按钮时,会执行一个js函数(login_py),该函数恢复输入(#request)的值,并显示一个gif(loader.gif),表明请求正在处理中,然后,通过后端将该值发送到python,并通过python执行php#u函数,该函数处理来自php文件(login.php)的调用,一旦调用结束,将删除gif,php响应放在span(#响应)中 我的问题是,当按下“P

我正在用pyqt5开发一个应用程序,它通过QtWebChannel作为一个web应用程序,当你点击带有html“Python”文本的按钮时,会执行一个js函数(login_py),该函数恢复输入(#request)的值,并显示一个gif(loader.gif),表明请求正在处理中,然后,通过后端将该值发送到python,并通过python执行php#u函数,该函数处理来自php文件(login.php)的调用,一旦调用结束,将删除gif,php响应放在span(#响应)中

我的问题是,当按下“Python”按钮时,应用程序窗口会暂时冻结,而且这种情况的发生并不令人愉快。此外,表示它正在加载的gif从未出现。我想知道,该请求是否可以以一种更类似于ajax请求的方式进行,在ajax中,窗口不会冻结

或者,还有一个带有文本“Javascript”的按钮,用于处理ajax的请求,这与我希望对“Python”按钮的请求相同

我澄清了原始login.php文件往往需要一段未知的时间来响应,为了不放置整个原始代码,我保留了这个模拟我的情况的修改后的login.php

login.php


test.py

从PyQt5导入QtCore、QtGui、qtwidget、QtWebEngineWidgets、QtWebChannel
导入json
导入操作系统
#路径=”http://localhost/test.html"
path=“test.html”
dirr=os.path.join(os.path.dirname(os.path.realpath(_文件__)),path)
类后端(QtCore.QObject):
valueChanged=QtCore.pyqtSignal(str)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self._value=“”
@QtCore.pyqtProperty(str)
def值(自身):
返回自我值
@价值设定者
def值(自身,v):
自我价值=v
self.valueChanged.emit(v)
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.webEngineView=QtWebEngineWidgets.QWebEngineView()
lay=qtwidts.QVBoxLayout(self)
lay.setContentsMargins(0,0,0,0)
lay.addWidget(self.webEngineView)
后端=后端(自身)
backend.valueChanged.connect(self.php_函数)
self.channel=QtWebChannel.QWebChannel()
self.channel.registerObject(“后端”,后端)
self.webEngineView.page().setWebChannel(self.channel)
#self.webEngineView.setUrl(QtCore.QUrl(路径))
self.webEngineView.setUrl(QtCore.QUrl.fromLocalFile(dirr))
@QtCore.pyqtSlot(str)
def php_函数(self,value):
data=os.popen('php login.php'+value).read()
data=json.load(数据)
self.webEngineView.page().runJavaScript(“$”(“#加载程序”).removeAttr(“src”);$(“#响应”).text(“'+数据[“一”]+”)”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec_())
test.html


var-backend=null;
if(QWebChannel的类型!=“未定义”){
新的QWebChannel(qt.WebChannel传输,功能(通道){
后端=channel.objects.backend;
});
}
功能登录(请求){
$(“#loader”).attr(“src”、“loader.gif”);
backend.value=请求;
}
函数登录(请求){
$(“#loader”).attr(“src”、“loader.gif”);
$.ajax({
url:'login.php',
键入:“get”,
数据:{one:request},
成功:功能(数据){
$(“#装入器”).removeAttr(“src”);
$(“#答复”).text(data.one);
}
})
}
Javascript
python


os.popen()
是一个阻塞任务,它将冻结Qt的事件循环,导致GUI冻结,因此您必须将该方法替换为不阻塞的方法,例如使用
QProcess
,或者在极端情况下在另一个线程上运行它,在这种情况下,使用QProcess并异步发送信息就足够了

导入json
导入操作系统
从PyQt5导入QtCore、QtGui、QtWidgets、QtWebEngineWidgets、QtWebChannel
current_dir=os.path.dirname(os.path.realpath(uu文件_uu))
#路径=”http://localhost/test.html"
path=“test.html”
dirr=os.path.join(当前目录,路径)
类后端(QtCore.QObject):
valueChanged=QtCore.pyqtSignal(str)
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self._value=“”
@pyqtProperty(str,notify=valueChanged)
def值(自身):
返回自我值
@价值设定者
def值(自身,v):
自我价值=v
self.valueChanged.emit(v)
类小部件(qtwidts.QWidget):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.webEngineView=QtWebEngineWidgets.QWebEngineView()
lay=qtwidts.QVBoxLayout(self)
lay.setContentsMargins(0,0,0,0)
lay.addWidget(self.webEngineView)
后端=后端(自身)
backend.valueChanged.connect(self.php_函数)
self.channel=QtWebChannel.QWebChannel()
self.channel.registerObject(“后端”,后端)
self.webEngineView.page().setWebChannel(self.channel)
#self.webEngineView.setUrl(QtCore.QUrl(路径))
self.webEngineView.setUrl(QtCore.QUrl.fromLocalFile(dirr))
self.\u php\u process=PhpProcess()
self.\u php\u process.resultChanged.connect(self.process\u php\u result)
@QtCore.pyqtSlot(str)
def php_函数(self,value):
self.\u php\u process.execute(值)
@QtCore.pyqtSlot(str)
def过程\ php\结果(自身、数据):
data=json.load(数据)
self.webEngineView.page().runJavaScript(
“$”(“#加载程序”).removeAttr(“src”);$(“#响应”).text(“'
+数据[“一”]
+ '");'
)
类PHP过程(QtCore.QObject):
resultChanged=QtCore.pyqtSignal(str)
def uuu init uuu(self,parent=None):
超级()_