如何在PySide/PyQt中终止纯控制台应用程序?

2024-10-01 17:40:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将(旧样式)PyQt信号/插槽上的Summerfield's article代码转换为新样式的PySide代码。一个例子是纯控制台应用程序,我以前从未使用过它。不幸的是,当我多次尝试运行它时,我被告知前一个应用程序仍在运行。在

这是一个简单的应用程序:它基本上可以让你设置一个数字,如果这个数字是新的,它会报告:

from PySide import QtCore
import sys

class TaxRate(QtCore.QObject):
    rateChangedSig=QtCore.Signal(float)

    def __init__(self):
        QtCore.QObject.__init__(self)
        self.rate = 17.5

    def getRate(self):
        return self.rate

    def setRate(self, newRate):
        if newRate != self.rate:
            self.rate = newRate
            self.rateChangedSig.emit(self.rate)  #was self.emit(SIGNAL("rateChanged"), self.rate)

@QtCore.Slot() #technically not really needed
def rateChangedSlot(value):
    print("Tax rate changed to {0:.2f} %".format(value))


if __name__=="__main__":
    qtApp = QtCore.QCoreApplication(sys.argv)  #origional had QtGui.QApplication, but there is no GUI
    vat = TaxRate()
    vat.rateChangedSig.connect(rateChangedSlot) #was vat.connect(vat, SIGNAL("rateChanged"), rateChanged)
    vat.setRate(8.5)     # A change will occur (new rate is different)

    qtApp.quit() 
    sys.exit(qtApp.exec_())

总的来说,它的工作与预期一样,只是最后两行没有终止进程。当我尝试运行程序两次时,第二次我的IDE(Spyder)总是告诉我它已经在一个单独的进程中运行。如果我尝试从命令行运行它,窗口就会挂起。在

奇怪的是,当我注释掉最后两行时,我没有得到这个警告。这与我所期望的正好相反(基于以前使用pysidegui应用程序和the documentation for quit())的经验)。在

在Zetcode的Closing a window示例之后,我尝试将qtApp.quit()替换为qtApp.instance().quit(),这产生了相同的非杀伤性结果。在

那么,我该怎么杀了它?在

一个想法是,我一开始就不应该开始它(as suggested here)。尽管它是一个纯控制台应用程序,Summerfield的原始程序是用app=QtGui.QApplication(sys.argv)初始化的,并且它不包含最后两行。很多次都很好。然而,是否有人担心每次运行都会创建一个新的进程,所以他的程序似乎在没有警告的情况下有效地增加了进程?(请注意,在实践中,我不认为我的系统会发生这种情况,因此,由于我不明白的原因,答案似乎是“不”)。在

使用PySide控制/初始化/终止控制台应用程序的正确方法是什么?在

(这暂时忽略了一个问题,即为什么要在Pythonas has been pointed out previously中为纯控制台应用程序使用PySide。但如果有人想回答这个单独的问题,我可以为它单独提出一个问题)。在


潜在相关职位:


Tags: self程序应用程序rate进程defsysquit
1条回答
网友
1楼 · 发布于 2024-10-01 17:40:52

问题是因为在调用QCoreApplication.exec_()之前先调用QCoreApplication.quit()。对quit的调用没有在事件循环中排队,而是立即发生。对QCoreApplication.exec_()的调用启动事件循环,该循环仅在事件循环运行时对QCoreApplication.exit()(或QCoreApplication.quit())的调用结束。在

这在Qt documentation of ^{}中有一些解释,但是很容易遗漏。在

我想您不需要真正调用exec_(),因为您当前的代码中没有使用任何事件(大多数事件都是与窗口/鼠标/键盘有关的,尽管您将来可能会使用一些类似于QTimer生成的事件)。这实际上取决于你将来想用这个程序做什么。 如果不调用exec_(),那么脚本将像通常预期的任何Python脚本那样退出(代码中唯一的阻塞函数是调用exec_(),请删除该函数,并且没有任何内容保持它的运行)

相关问题 更多 >

    热门问题