python - 为什么while循环冻结api gui
问题描述
我尝试创建 GUI Api。首先,我在控制台中仅使用打印信息构建 python 脚本。
所以我想将应用程序重新构建为具有接口的应用程序。我决定使用 PyQt5
我遇到了循环 While 的问题。应用程序在运行时冻结
我准备了一个简短的脚本来模拟这个问题。主程序看起来不同
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets
from termcolor import colored
import time
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'API NORD'
self.left = 0
self.top = 0
self.width = 300
self.height = 200
self.setWindowTitle(self.title)
self.resize(800, 600)
self.center()
self.table_widget = MyTableWidget(self)
self.setCentralWidget(self.table_widget)
self.show()
def center(self):
# geometry of the main window
qr = self.frameGeometry()
# center point of screen
cp = QDesktopWidget().availableGeometry().center()
# move rectangle's center point to screen's center point
qr.moveCenter(cp)
# top left of rectangle becomes top left of window centering it
self.move(qr.topLeft())
class MyTableWidget(QWidget):
def __init__(self, parent):
super(QWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
self.pushButton1 = QPushButton("Run")
self.layout.addWidget(self.pushButton1)
self.pushButton1.clicked.connect(self.button2_clicked)
self.textedit = QtWidgets.QTextEdit(readOnly=True)
self.layout.addWidget(self.textedit)
self.textedit.setText("STATUS")
def onClicked(self):
radioButton = self.sender()
if radioButton.isChecked():
x=0
# print("Shop is %s" % (radioButton.shop))
self.Sklep=radioButton.shop
self.l1.setText(self.Sklep)
return
def checkBulkStatus(self):
Status = "Start"
x=0
self.textedit.setText("Start")
while x < 5:
print("Aktualny Status:", colored(Status,"yellow"))
Status="Running"
self.textedit.append(Status)
if Status=="FAILED":
print("Error")
break
time.sleep(2.5)
x+=1
print("Aktualny Status: ", colored("COMPLETED", "green"))
self.textedit.setText("COMPLETED")
def button2_clicked(self):
self.checkBulkStatus()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
在主程序中,我使用 while 检查 GraphQL 中 BULK 请求的状态:
def checkBulkStatus(self):
self.url = self.auth(self.Sklep)["url_auth"]
print(self.url)
Status = "Start"
self.textedit.setText("Start")
while Status != "COMPLETED":
print("Aktualny Status:", colored(Status,"yellow"))
checking = self.Core.callShopifyGraphQL(self.Core.CheckQuery,self.url)
result = checking.json()
Status=result["data"]["currentBulkOperation"]["status"]
self.textedit.append(Status)
if Status=="FAILED":
print(result["data"]["currentBulkOperation"])
break
time.sleep(2.5)
print("Aktualny Status: ", colored("COMPLETED", "green"))
URL_bulk=result["data"]["currentBulkOperation"]["url"]
解决方案
问题是 gui 与脚本在同一线程中运行,因此当您运行脚本时,它会冻结界面。为了防止这种情况发生,您需要在线程中运行脚本,因为这样您可以与主线程共享变量。
希望对你有帮助,问候。
推荐阅读
- java - 如何迭代这种类型的 Hashtable?
- r - 无法使用表的聚合计算平均值,结果显示为 N/A
- javascript - Object.entries().map() 没有返回输出
- java - 不知道如何让 java 编译器运行 HelloWorld,尝试了一切
- apache-spark - 如何从 Jupyter 笔记本中更改运行时 Spark 工作人员使用的 python 可执行文件
- java - 无法从 JAR 文件中导入资源
- wordpress - 在 WordPress 网站上使用 Screaming Frog 的“错误 502 - 网关错误”
- postgresql - 如何修复错误解析错误:语法错误,postgresql查询中的意外''?
- html - 将 AngularJS 值插入 HTML 表不起作用
- spring-boot - 当同时支持 http 和 https 时,Spring Boot Tomcat httpsession 不一样