纳速健身

标题: PyQt5点击菜单栏弹出dialog新窗口闪退,解决新窗口闪退的实现方法 [打印本页]

作者: awagink    时间: 2021-1-4 15:48
标题: PyQt5点击菜单栏弹出dialog新窗口闪退,解决新窗口闪退的实现方法
实现的功能为:当点击菜单中某个菜单时,会弹出一个新窗口,下面就列出部分代码

方法一:
  1. def mail_setting(self):
  2.     log.debug("open mail settings")
  3.      # <font color="#ff0000">需要通过self实例化为全局变量,不加self的话,一运行就被回收,也就无法显示。</font>
  4.      <font color="#ff0000">self.</font>mail_set = MailSetting()
  5.      <font color="#ff0000">self.</font>mail_set.show()
复制代码



方法二:
因为你的dialog是申请的栈空间,函数运行结束后内存释放,界面自然消失。

申请堆空间可以解决


方法三:

今天遇到一个很有趣的现象。就是之前运行pyqt5的主窗口的时候都是通过如下方式来呈现的:

  1. if __name__=='__main__':
  2.     app = QApplication(sys.argv)
  3.     ex =Example()

  4.     sys.exit(app.exec())
复制代码

上面这种可以运行并显示一个正常的主窗口

然后呢,早上突发奇想,觉得代码可以精简,于是改成如下方式:

  1. if __name__=='__main__':
  2.     app = QApplication(sys.argv)
  3.     Example()

  4.     sys.exit(app.exec())
复制代码

gg!!!!

感觉跟上面没有什么太大的差别,唯一的区别就是构造函数执行之后的结果有没有赋值的区别了

但是第二段代码执行之后出现一个很奇妙的现象,就是运行之后,窗口也会出现,但是立马闪退。一开始理解不了。后面查了相关资料,发现原因是因为:

对象赋值其实就是引用,要是没有赋值就是没有引用

具体解释:

就像linux中的硬链接一样,只有还有一个硬链接存在,那么这个文件就不会被删除。这里的对象也是一样,只要有一个指向存在,就不会被删除。可以用del方法进行验证,del方法的特性就是如果一个对象没有引用,那么python机制就会立刻执行这个del函数。所以,Example()执行完后,发现没有代码可执行了,那么内存中的对象会被清除,这样python就会自动执行del函数。因为窗口对象被回收了,所以窗口就自动消失了




欢迎光临 纳速健身 (https://nasue.com/) Powered by Discuz! X3.4