【发布时间】:2014-07-31 06:32:22
【问题描述】:
我正在尝试将代码从(旧式)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) 总是告诉我它已经在一个单独的进程中运行。如果我尝试从命令行运行它,窗口就会挂起。
奇怪的是,当我注释掉最后两行时,我没有收到此警告。这与我的预期相反(基于之前使用 PySide GUI 应用程序和the documentation for quit() 的经验)。
按照 Zetcode 的 Closing a window 示例,我尝试将 qtApp.quit() 替换为 qtApp.instance().quit(),这产生了相同的非杀戮结果。
那么,我该如何杀死这个东西呢?
一个想法是,我什至不应该一开始就启动它 (as suggested here)。尽管它是一个纯控制台应用程序,但 Summerfield 的原始程序使用app=QtGui.QApplication(sys.argv) 进行初始化,并且它不包含最后两行。事情运行良好,多次。但是,是否担心每次运行都会创建一个新进程,所以他的程序似乎在没有警告的情况下有效地增加了进程? (请注意,在实践中,我认为我的系统上不会发生这种情况,因此由于我不明白的原因,答案似乎是“否”)。
使用 PySide 控制/初始化/终止控制台应用程序的正确方法是什么?
(暂时忽略了这个问题,为什么人们会在 Python as has been pointed out previously 中将 PySide 用于纯控制台应用程序。但如果有人有兴趣回答这个单独的问题,我可以单独开始问题)。
可能相关的帖子:
【问题讨论】: