|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 wei_Y 于 2015-5-25 13:01 编辑
0. Python里的退出还真不少。尽管他们都可以退出程序,那他们到底有啥区别咧?
1. 有哪些可以退出。
python自带的有四个退出。(或许还有,报错不算。)PyQt每个窗口都有一个close方法用于退出。
2. 这些玩意的区别。
help命令查看帮助。
sys.exit
- exit(...)
- exit([status])
-
- Exit the interpreter by raising SystemExit(status).
- If the status is omitted or None, it defaults to zero (i.e., success).
- If the status is an integer, it will be used as the system exit status.
- If it is another kind of object, it will be printed and the system
- exit status will be one (i.e., failure).
复制代码
os._exit
- _exit(...)
- _exit(status)
-
- Exit to the system with specified status, without normal exit processing.
复制代码
quit
- class Quitter(builtins.object)
- | Methods defined here:
- |
- | __call__(self, code=None)
- |
- | __init__(self, name, eof)
- |
- | __repr__(self)
- |
- | ----------------------------------------------------------------------
- | Data descriptors defined here:
- |
- | __dict__
- | dictionary for instance variables (if defined)
- |
- | __weakref__
- | list of weak references to the object (if defined)
复制代码
exit
- class Quitter(builtins.object)
- | Methods defined here:
- |
- | __call__(self, code=None)
- |
- | __init__(self, name, eof)
- |
- | __repr__(self)
- |
- | ----------------------------------------------------------------------
- | Data descriptors defined here:
- |
- | __dict__
- | dictionary for instance variables (if defined)
- |
- | __weakref__
- | list of weak references to the object (if defined)
复制代码
查看帮助可以发现,quit和exit没啥区别,连帮助都一个样。
那先区分一下sys.exit和exit/quit
通过帮助信息可以看出,sys.exit有个主要的功能就是抛出错误SystemExit还有自定义错误码,正常退出是0(执行完整个过程。)。那exit/quit是否有呢。
- try:
- sys.exit()
- except SystemExit:
- print(1)
- try:
- exit()
- except SystemExit:
- print(2)
复制代码
结果:
发现也有这个错误。
基本来看sys.exit与exit/quit并没啥区别。可能exit/quit在shell中使用起来比较方便。sys.exit显得比较高端- -。
那os._exit和sys.exit的区别。帮助上说os._exit直接退出,不走正常的处理。也就是说直接干掉这个进程,没有异常,一些缓存啥的也不清理。
区别1: sys.exit可抛出异常,可以捕获这个异常进行一些处理。(根据非正常退出时的状态码。)
os._exit直接杀进程,简单粗暴。
那在线程中有什么影响木有呢。
- import time
- import sys
- import os
- import threading
- class T(threading.Thread):
- def __init__(self, arg):
- super(T, self).__init__()
- self.arg = arg
- def run(self):
- time.sleep(self.arg)
- print(1+self.arg)
- os._exit(0)
- a = T(1)
- b = T(2)
- a.start()
- b.start()
复制代码
打印2之后,程序结束。(废话,进程都没了。)
换成sys.exit()
打印2之后又打印了3。
又测试了一下exit/quit。
区别2: sys.exit可以退出某一线程,而不退出整个程序。
os._exit直接退出整个程序。
说了这么一大坨和pyqt有什么关系?
- import sys
- import os
- from PyQt5.QtWidgets import *
- from PyQt5.QtGui import *
- class Main(QWidget):
- def __init__(self, parnet=None):
- super(Main, self).__init__(parnet)
- self.setWindowTitle('Hello Qt')
- self.setWindowIcon(QIcon('../pic/f.jpg'))
- self.resize(300, 200)
- self.btn_close = QPushButton(self)
- self.btn_close.setText('关闭')
- self.btn_close.setIcon(QIcon('../pic/f.jpg'))
- self.btn_close.clicked.connect(sys.exit)
- def closeEvent(self, event):
- print(1)
- if __name__ == '__main__':
- app = QApplication(sys.argv)
- main = Main()
- main.show()
- sys.exit(app.exec_())
复制代码
我们创建了一个关闭按钮,连接到sys.exit。
重写的关闭事件,关闭窗口前做的事。我们让他打印出1。
并没有触发关闭事件。
换成os._exit试试。
- self.btn_close.clicked.connect(os._exit)
复制代码
依然没有触发关闭事件。
难道exit/quit和他们微妙的区别会体现在这里?
我们试一下。
- self.btn_close.clicked.connect(exit)
复制代码
- self.btn_close.clicked.connect(quit)
复制代码
依然木有触发关闭事件。
Q: what!什么情况,你确定关闭会调用closeEvent?
A: 不信点窗口右上角~。
Q: 还真有,那怎么写才能让他触发关闭事件?
A: 每个窗口都有一个close函数,用于关闭窗口,这个函数会触发关闭事件。右上角那个叉也是调用的这个函数。可以打印event看一看。
- self.btn_close.clicked.connect(self.close)
- def closeEvent(self, event):
- print(event)
复制代码
- <PyQt5.QtGui.QCloseEvent object at 0x01896800>
- ***Repl Closed***
复制代码
网上教程大部分都用的sys.exit作为退出连接,想触发关闭事件还是用close关闭吧,这个p问题也是折腾好久。。
简单总结:
exit/quit 使用方便,一般用于shell里交互。
sys.exit 可用于退出单个线程。
os._exit 大杀器,直接使用可能会造成一定量的垃圾。
另外:
在pyqt中想要触发关闭事件需要用
self.close
以上三个均不会触发关闭事件。
|
评分
-
参与人数 2 | 荣誉 +10 |
鱼币 +10 |
贡献 +8 |
收起
理由
|
~风介~
| + 5 |
+ 5 |
+ 5 |
热爱鱼C^_^ |
拈花小仙
| + 5 |
+ 5 |
+ 3 |
感谢楼主无私奉献! |
查看全部评分
|