我正在学习pyqt4并正在关注互联网上的教程。不知何故,示例代码中的退出行不起作用:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
ZetCode PyQt4 tutorial
This program creates a quit
button. When we press the button,
the application terminates.
author: Jan Bodnar
website: zetcode.com
last edited: October 2011
"""
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
qbtn = QtGui.QPushButton('Quit', self)
qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
qbtn.resize(qbtn.sizeHint())
qbtn.move(50, 50)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Quit button')
self.show()
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec())
if __name__ == '__main__':
main()
当我按下gui中的X按钮或退出按钮时,控制台出现了一些错误:
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
Traceback (most recent call last):
File "D:\Raymond\Programming Practice\python\gui_qt\lesson1_basic\gui_quit.py", line 46, in <module>
main()
File "D:\Raymond\Programming Practice\python\gui_qt\lesson1_basic\gui_quit.py", line 42, in main
sys.exit(app.exec())
SystemExit: 0
我通过替换行
修复了代码sys.exit(app.exec())
这一行:
return app.exec()
然后应用程序正常退出。但是我不确定这种方法是否有任何缺点,因为它只返回状态。
答案 0 :(得分:2)
我认为你会发现正确的语法是sys.exit(app.exec_())
注意下划线
它无法解决控制+ C问题,但程序将退出而不会在命令行中显示错误。
答案 1 :(得分:0)
实际上,这在技术上并不是一个错误,它是一个例外。虽然错误是例外,但并非所有异常都必然是错误。有几个“特殊”异常,例如SystemExit
,StopIteration
等等,python用于各种不同的事情。 sys.exit
会引发SystemExit
例外以退出您的计划。
来自Docs:
sys.exit([参数])
退出Python。这是通过引发SystemExit异常来实现的,因此可以接受try语句的finally子句指定的清理操作,并且可以拦截外层的退出尝试。
可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值被贝壳等视为“异常终止”。大多数系统要求它在0-127范围内,否则会产生不确定的结果。有些系统有一个约定,用于为特定的退出代码分配特定的含义,但这些通常是不发达的; Unix程序通常使用2表示命令行语法错误,1表示所有其他类型的错误。如果传递了另一种类型的对象,则None等效于传递零,并且任何其他对象将打印到stderr并导致退出代码为1.特别是,sys.exit(“some error message”)是一种快速方法发生错误时退出程序。
由于exit()最终“只”引发异常,它只会在从主线程调用时退出进程,并且不会拦截异常。
所以,sys.exit(app.exec())
与raise SystemExit(app.exec())
没什么不同。在这种情况下,通过添加sys.exit
,您真正改变的唯一方法是返回app.exec()
给出的退出代码。