返回顶部

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

[复制链接]
awagink 显示全部楼层 发表于 2021-1-4 15:48:13 |阅读模式 打印 上一主题 下一主题
实现的功能为:当点击菜单中某个菜单时,会弹出一个新窗口,下面就列出部分代码

方法一:
  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函数。因为窗口对象被回收了,所以窗口就自动消失了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

纳速健身网成立于2006年8月,是国内优秀健身运动网站,现拥浏览人数超30万。网站是集养生、武术、太极拳和健身气功等多种健身项目于一体的多功能交流平台。平台提供大量优质的教学视频、伴奏音乐(太极拳晨练音乐,广场舞音乐,健身气功音乐)、图文教程、运动科普和经验分享,为健身爱好者提供完善的运动指导平台。
  • 纳速QQ群乙:151815303
  • 纳速QQ群丙:79104490
  • 微信交流群:微信好友搜索【nasuwang】加小纳微信进群交流健身知识,备注【纳速】
  •                     或者扫描页面底部右侧二维码添加小纳微信>>>
  • 微信公众号

  • 微信群客服交流

  • Copyright © 2006-2021, 纳速健身网. | | 辽ICP备13002388号-1 辽公安网备21050202000005号公安网备号 纳速武术-乙 QQ