PyQt 指令是如何进行的? [关闭]
Posted
技术标签:
【中文标题】PyQt 指令是如何进行的? [关闭]【英文标题】:How does a PyQt intruction is proceeding? [closed] 【发布时间】:2020-02-04 18:14:59 【问题描述】:作为我的学习结束项目的一部分,我正在开发一个 GUI,它基本上接受输入值并从中运行计算。当我按下运行这些计算的按钮时,就会出现我的问题。我希望在计算期间禁用此按钮,并更改其文本以显示 GUI 正忙。
不幸的是,这些更改仅在计算结束时显示在 GUI 上,而不是在计算之前,即使在代码中运行模拟的函数之前调用它们也是如此。
因此我想知道这些说明是如何进行的,这样我也许可以了解下面发生了什么。
如果需要,这里是代码的简短摘录:
我按下时调用函数'onButtonClicked'
self.pushButton_simu.clicked.connect(self.onButtonClicked)
然后这个(缩短的)函数调用“displayGraph”,它将进行计算并显示结果
def onButtonClicked(self):
if (not self.exist and self.simu):
self.displayGraph()
最后,在这个文件中,我创建了一个文件,在其中放置了一些值,然后尝试禁用并更改按钮的文本(这不会立即起作用)。然后我用'simu.simulation'运行计算,当它结束时,我的消息框被显示,我的新文本和我的按钮被禁用。然后,当我关闭消息框时,文本立即更改,我的按钮再次无法使用。
def displayGraph(self):
with open("Input_simulation", 'wb') as dataFile:
pickle.dump([self.planete.reynolds(), self.planete.reynoldsMagnetique(), self.planete.stuart(), int(self.label_Vnbmode_2.text()), self.spinBox_pasmode.value()], dataFile)
self.pushButton_simu.setText("Simulation en cours")
self.pushButton_simu.setEnabled(False)
mode, wImMax = simu.simulation('Input_simulation')
infoBox = QtWidgets.QMessageBox()
infoBox.setIcon(QtWidgets.QMessageBox.Information)
infoBox.setWindowTitle("Information")
infoBox.setText("Simulation réussie")
infoBox.exec_()
self.pushButton_simu.setEnabled(True)
self.pushButton_simu.setText("Lancer la simulation")
我试图在 setText 和模拟开始之间添加一个“time.sleep”,但它根本不起作用,所以我真的不明白发生了什么。就像模拟太忙而无法显示更改一样。
编辑:感谢 rbaleksandar,我通过使用它解决了我的问题:
QtCore.QCoreApplication.processEvents()
【问题讨论】:
@eyllanesc 我没有这样做,因为我不知道该怎么做,除了发布我更喜欢避免的整个模拟。我认为在这种情况下,更多的是了解正在发生的事情,而不是发现一些错误或错误,因此 imo 不需要最小的可重现示例。 没有人要求你发布你的模拟代码,我已经申请了 MRE。如果您的代码很小,那么它可能是一个有效的 MRE,但那时 OP 将不得不努力创建一个新项目,该项目只实现了带来问题的功能。恕我直言是必要的,因为您指出根据您的逻辑它应该可以工作,但由于某些未知原因(可以推测但我不喜欢这样做)它不起作用。 是的,我只是说。我理解你的观点,我同意,即使没有模拟,我的代码也很大,但你是对的,我应该用一个需要时间计算的函数做一个小例子,这样 OP 就可以运行它而无需做任何事情. (以防万一我以前的帖子,我在这里相当新,我知道有时可能会很讨厌那些不自己搜索的新人第一次在这里发帖,但我不是其中之一!我看到了您链接我的帖子的线程,我尝试了解决方案,但它没有解决我的问题,这就是我发布的原因) @eyllanesc 尽管 MRE 会很好,但很清楚这里发生了什么。即使没有任何代码......所以仅仅因为这个问题而结束这个问题并不是一个好的举动。此外,由于代码中问题点周围的混乱,并不总是可以提供 MRE,正如 OP 所述。 【参考方案1】:您需要在单独的线程中运行计算。否则,确切地体验您的情况 - 您的按钮被阻止(实际上整个 UI 是),因为密集计算占用了主线程的所有处理时间,UI 也驻留在其中(以及与它相关的所有事情,如绘图,事件处理等)。如果线程忙于计算你的东西,它就没有“时间”去做其他事情了。
通常这是通过创建一个QThread
并将另一个对象的推送(使用moveToThread(...)
)到它,您实际计算发生的地方。这个对象被称为工作者,而线程——工作者线程。然后,您可以将来自您的工作人员的信号连接到您的按钮或包含它的小部件,并分别禁用/启用它。
作为该解决方案的替代方案,您可以选择QRunnable
,稍作修改以使其能够实际发送信号(因为QRunnable
实际上不是QObject
派生类,因此您需要显式地从QObject
继承为了使用槽和信号)。
【讨论】:
非常感谢,我解决了我的问题,现在它可以完美运行了! 很高兴听到这个消息。以上是关于PyQt 指令是如何进行的? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何仅使用 mov、add、sub、neg 在 4 条指令中限制 x=2a+3b? [关闭]