实现的功能为:当点击菜单中某个菜单时,会弹出一个新窗口,下面就列出部分代码
方法一:
- def mail_setting(self):
- log.debug("open mail settings")
- # <font color="#ff0000">需要通过self实例化为全局变量,不加self的话,一运行就被回收,也就无法显示。</font>
- <font color="#ff0000">self.</font>mail_set = MailSetting()
- <font color="#ff0000">self.</font>mail_set.show()
复制代码
方法二:
因为你的dialog是申请的栈空间,函数运行结束后内存释放,界面自然消失。
申请堆空间可以解决
方法三:
今天遇到一个很有趣的现象。就是之前运行pyqt5的主窗口的时候都是通过如下方式来呈现的:
- if __name__=='__main__':
- app = QApplication(sys.argv)
- ex =Example()
-
- sys.exit(app.exec())
复制代码
上面这种可以运行并显示一个正常的主窗口
然后呢,早上突发奇想,觉得代码可以精简,于是改成如下方式:
- if __name__=='__main__':
- app = QApplication(sys.argv)
- Example()
-
- sys.exit(app.exec())
复制代码
gg!!!!
感觉跟上面没有什么太大的差别,唯一的区别就是构造函数执行之后的结果有没有赋值的区别了
但是第二段代码执行之后出现一个很奇妙的现象,就是运行之后,窗口也会出现,但是立马闪退。一开始理解不了。后面查了相关资料,发现原因是因为:
对象赋值其实就是引用,要是没有赋值就是没有引用
具体解释:
就像linux中的硬链接一样,只有还有一个硬链接存在,那么这个文件就不会被删除。这里的对象也是一样,只要有一个指向存在,就不会被删除。可以用del方法进行验证,del方法的特性就是如果一个对象没有引用,那么python机制就会立刻执行这个del函数。所以,Example()执行完后,发现没有代码可执行了,那么内存中的对象会被清除,这样python就会自动执行del函数。因为窗口对象被回收了,所以窗口就自动消失了 |