Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Python 如何在PySide/PyQt中杀死一个纯控制台应用程序?_Python_Qt_Pyqt_Pyside - Fatal编程技术网

Python 如何在PySide/PyQt中杀死一个纯控制台应用程序?

Python 如何在PySide/PyQt中杀死一个纯控制台应用程序?,python,qt,pyqt,pyside,Python,Qt,Pyqt,Pyside,我正在尝试将on(旧式)PyQt信号/插槽的代码转换为新型PySide代码。一个例子是一个纯控制台应用程序,我以前从未使用过它。不幸的是,当我尝试多次运行它时,我被告知前一个应用程序仍在运行 这是一个简单的应用程序:它基本上允许您设置一个数字,如果该数字是新的,则会报告: from PySide import QtCore import sys class TaxRate(QtCore.QObject): rateChangedSig=QtCore.Signal(float)

我正在尝试将on(旧式)PyQt信号/插槽的代码转换为新型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应用程序和应用程序的经验)

按照Zetcode的示例,我尝试将
qtApp.quit()
替换为
qtApp.instance().quit()
,这产生了相同的非致命性结果

那么,我该如何杀死这东西呢

一个想法是,我甚至不应该一开始就这么做()。尽管它是一个纯粹的控制台应用程序,但Summerfield的原始程序初始化为
app=QtGui.QApplication(sys.argv)
,并且它不包含最后两行。事情进展顺利,好几次了。然而,是否有人担心每次运行都会创建一个新的进程,因此他的程序似乎可以在没有警告的情况下有效地增加进程?(注意,在实践中,我认为这不会发生在我的系统上,因此出于我不理解的原因,答案似乎是“否”)

使用PySide控制/初始化/杀死控制台应用程序的正确方法是什么

(这暂时忽略了一个问题,为什么会在Python中使用PySide作为纯控制台应用程序。但是如果有人有兴趣回答这个单独的问题,我可以为它单独提出一个问题)


潜在相关帖子:


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

这在中有所解释,但很容易忽略

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

我最初没有退出命令:没有它,进程仍然保持活动状态(基本上,只要我调用exec_u3;(),不管我做什么,它似乎都会保持活动状态)。正如您所猜测的,我添加了
quit
,希望它进入事件队列。根据您的评论,我还尝试拆分它:
qtApp.exec_3;();qtApp.instance.quit();sys.exit())
。运气不好,进程还活着。我如何杀死这件事?如果调用exec_uz()真的很关键呢?关键是对于一个纯控制台应用程序,它不仅不重要,而且永远不应该重要?这是有记录的,还是有常识的?
qtApp.exec_z)
是一个阻塞函数。它启动一个事件循环,直到有人向其发布事件后才会结束。因此,调用之后的任何代码都不会运行(因为事件循环永远不会结束)。大多数事件都是鼠标单击等,但显然没有这些事件。
QTimer
是将发布事件的为数不多的事情之一(但您显然需要在事件循环启动之前编写发生的代码-事件将被放置在队列中,直到循环启动为止)。其他可能包括Qt网络库(但老实说,我没有完整的列表!),请参阅: