awagink 发表于 2021-1-4 15:48:13

PyQt5点击菜单栏弹出dialog新窗口闪退,解决新窗口闪退的实现方法

实现的功能为:当点击菜单中某个菜单时,会弹出一个新窗口,下面就列出部分代码

方法一:
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函数。因为窗口对象被回收了,所以窗口就自动消失了
页: [1]
查看完整版本: PyQt5点击菜单栏弹出dialog新窗口闪退,解决新窗口闪退的实现方法