当前位置: 首页 > 知识库问答 >
问题:

为什么循环冻结api gui[重复]

李宜然
2023-03-14

我试图创建GUI Api。首先,我只在控制台中使用打印信息构建python脚本。

所以我想将应用程序重建为具有接口的应用程序。我决定用PyQt5

我在运行时遇到了循环问题。应用程序在运行时冻结

我准备了一个简短的脚本来模拟这个问题。主程序看起来不一样

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_())

在主程序中,在检查GraphQL中批量请求的状态时使用:

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"]

共有1个答案

毛淳
2023-03-14

问题是gui与脚本在同一线程中运行,因此当您运行脚本时,它会冻结界面。为了防止这种情况发生,您需要在线程中运行脚本,因为这样您可以与主线程共享变量。

我希望它能帮助你,问候你。

 类似资料:
  • 问题内容: 我正在做一个游戏,我需要每3秒更新一次JProgressBar。为此,我使用while循环。问题是我的程序由于while循环而冻结(我在其他问题中读过它,它们没有帮助我解决此问题)。我不知道该怎么解决。这是我的代码: 你能帮我吗? 问题答案: 您应该在自己的线程中运行循环: 顺便说一句:如果您没有在方法中使用“ String [] args”,则没有理由在方法中声明它。

  • 我想知道为什么这个函数中的foreach循环在只经过一次循环后输出数据就结束了。我在MySQL中运行了这个查询,它返回了我要查找的8条记录。当I

  • 编辑:为什么在局部变量上这么快?(~16秒进行相同的迭代,但对函数内部的局部变量进行迭代)

  • 问题内容: http://i.stack.imgur.com/XvHm5.png 当我单击“打开”按钮时,它将开始在JTextField上发送垃圾邮件1。而是冻结整个GUI,包括关闭按钮。我正在使用while循环,当您再次单击jButton时,它将停止。因为jButton被冻结,所以我无法停止该程序。我已经读过线程和多线程将有所帮助,但是所有教程都太复杂了,以至于我无法理解。他们说将循环和GUI放

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码