鱼C论坛

 找回密码
 立即注册
查看: 7675|回复: 9

[技术交流] 温故而知新---PyQt5学习笔记系列---exit or quit?傻傻分不清。

[复制链接]
发表于 2015-5-25 13:01:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 wei_Y 于 2015-5-25 13:01 编辑


0.jpg

0.  Python里的退出还真不少。尽管他们都可以退出程序,那他们到底有啥区别咧?

1. 有哪些可以退出。
import sys
sys.exit()
import os
os._exit()
quit()
exit()

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)

结果:
1
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

***Repl Closed***
打印2之后,程序结束。(废话,进程都没了。)

换成sys.exit()

打印2之后又打印了3。
2
3

***Repl Closed***

又测试了一下exit/quit。
2
3

***Repl Closed***


区别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。
***Repl Closed***

并没有触发关闭事件。
换成os._exit试试。
self.btn_close.clicked.connect(os._exit)
***Repl Closed***

依然没有触发关闭事件。
难道exit/quit和他们微妙的区别会体现在这里?
我们试一下。
self.btn_close.clicked.connect(exit)
***Repl Closed***
self.btn_close.clicked.connect(quit)
***Repl Closed***

依然木有触发关闭事件。

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 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

  • · PyQt|主题: 45, 订阅: 73
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-25 14:49:45 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-28 20:54:36 | 显示全部楼层
学习学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-29 13:00:45 | 显示全部楼层
确实没有研究过这方面,学习了到了,不过学以致用还得些时日~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-29 13:49:54 | 显示全部楼层
学习了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-20 15:34:07 | 显示全部楼层
get
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-21 10:20:27 | 显示全部楼层
收藏一下,用的时候再来看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-8-24 10:35:57 | 显示全部楼层
学习了,确实学习需要认真,并且自己努力钻研!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-31 15:58:18 | 显示全部楼层
前几天也碰到这个问题,早到这来就好了,谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-10 19:41:46 | 显示全部楼层
多谢分享啊~学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 08:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表