• 售前

  • 售后

热门帖子
入门百科

Python PyQt5中弹出子窗口解决子窗口一闪而过的题目

[复制链接]
此人正在学习 显示全部楼层 发表于 2021-10-26 12:45:39 |阅读模式 打印 上一主题 下一主题
方式一:槽函数中创建子窗口对象,赋值到平凡变量


在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到平凡变量,并调用其 show 方法。
  1. from PyQt5.QtWidgets import *
  2. import sys
  3. class Main(QMainWindow):
  4.   def __init__(self):
  5.     super().__init__()
  6.     self.setWindowTitle("主窗口")
  7.     button = QPushButton("弹出子窗", self)
  8.     button.clicked.connect(self.show_child)
  9.   def show_child(self):
  10.     child_window = Child()
  11.     child_window.show()
  12. class Child(QWidget):
  13.   def __init__(self):
  14.     super().__init__()
  15.     self.setWindowTitle("我是子窗口啊")
  16. # 运行主窗口
  17. if __name__ == "__main__":
  18.   app = QApplication(sys.argv)
  19.   window = Main()
  20.   window.show()
  21.   sys.exit(app.exec_())
复制代码
运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口一闪而过。
方式二:槽函数中创建子窗口对象,赋值为对象属性


在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象并赋值为对象属性,并调用其 show 方法。
  1. from PyQt5.QtWidgets import *
  2. import sys
  3. class Main(QMainWindow):
  4.   def __init__(self):
  5.     super().__init__()
  6.     self.setWindowTitle("主窗口")
  7.     button = QPushButton("弹出子窗", self)
  8.     button.clicked.connect(self.show_child)
  9.   def show_child(self):
  10.     self.child_window = Child()
  11.     self.child_window.show()
  12. class Child(QWidget):
  13.   def __init__(self):
  14.     super().__init__()
  15.     self.setWindowTitle("我是子窗口啊")
  16. # 运行主窗口
  17. if __name__ == "__main__":
  18.   app = QApplication(sys.argv)
  19.   window = Main()
  20.   window.show()
  21.   sys.exit(app.exec_())
复制代码
运行结果: 该段代码运行后,点击主窗口中的按钮,子窗口正常打开,重复点击按钮,子窗口重复弹出。
方式三:在主窗口__init__方法中创建子窗


在主窗口__init__方法中创建子窗口对象并赋值为对象属性,添加按钮,并把按钮信号关联槽,在槽函数中调用子窗口对象的 show 方法。
  1. from PyQt5.QtWidgets import *
  2. import sys
  3. class Main(QMainWindow):
  4.   def __init__(self):
  5.     super().__init__()
  6.     self.setWindowTitle("主窗口")
  7.     button = QPushButton("弹出子窗", self)
  8.     button.clicked.connect(self.show_child)
  9.     self.child_window = Child()
  10.   def show_child(self):
  11.     self.child_window.show()
  12. class Child(QWidget):
  13.   def __init__(self):
  14.     super().__init__()
  15.     self.setWindowTitle("我是子窗口啊")
  16. # 运行主窗口
  17. if __name__ == "__main__":
  18.   app = QApplication(sys.argv)
  19.   window = Main()
  20.   window.show()
  21.   sys.exit(app.exec_())
复制代码
运行结果: 重复点击按钮,子窗口不重复弹出。
方式四:exec()方法


把例1的show()方法改为exec()方法
  1. from PyQt5.QtWidgets import *
  2. import sys
  3. class Main(QMainWindow):
  4.   def __init__(self):
  5.     super().__init__()
  6.     self.setWindowTitle("主窗口")
  7.     button = QPushButton("弹出子窗", self)
  8.     button.clicked.connect(self.show_child)
  9.   def show_child(self):
  10.     child_window = Child()
  11.     child_window.exec()
  12. class Child(QWidget):
  13.   def __init__(self):
  14.     super().__init__()
  15.     self.setWindowTitle("我是子窗口啊")
  16. # 运行主窗口
  17. if __name__ == "__main__":
  18.   app = QApplication(sys.argv)
  19.   window = Main()
  20.   window.show()
  21.   sys.exit(app.exec_())
复制代码
运行结果:子窗口顺利弹出,且不能重新选择父窗口
结论:


这里涉及到一个概念 模式对话框 与 非模式对话框 (modeless dialog | modal dialog)
模式对话框,就是在弹出窗口的时间,整个步伐就被锁定了,处于等待状态,直到对话框被关闭。这时每每是必要对话框的返回值举行下面的操纵。如:确认窗口(选择“是”或“否”)。
非模式对话框,在调用弹出窗口之后,调用马上返回,继续下面的操纵。这里只是一个调用指令的发出,不等待也不做任那里理。如:查找框。
show() ------  modeless dialog
exec() ------- modal dialog
      
  • 方式一中 子窗口 通过 show() 方法体现,为非模态窗口,它的实例为父窗口show_child()方法中的局部变量,当窗口体现后,父窗口的show_child()方法继续实验,当方法运行完后,python的回收机制就把局部变量烧毁了,相称于子窗口实例被烧毁,故子窗口一闪而过;  
  • 方式二中 子窗口实例为 主窗口类的变量,当show_child()方法运行完后,主窗口对象依旧存在,子窗口实例也存在,故子窗口正常体现,但是每一次运行槽函数都会重新创建子窗口对象;  
  • 方式三中 子窗口实例为 主窗口类的变量,当show_child()方法运行完后,主窗口对象依旧存在,子窗口实例也存在,故子窗口正常体现,每一次show_child()函数,重新调用子窗口对象show_child()方法,不会创建新窗口,且可随意在父,子窗口间切换;  
  • 方式四中 子窗口 通过 exec() 方法体现,为模态窗口,固然他为父窗口show_child()方法中的局部变量,由于阻塞的机制,父窗口show_child()并没有继续实验,故其不会像 例1 中 一闪而过,且不能在父,子窗口间切换;
到此这篇关于Python PyQt5中弹出子窗口解决子窗口一闪而过的题目标文章就介绍到这了,更多相干Python PyQt5弹出子窗口内容请搜刮草根技能分享从前的文章或继续欣赏下面的相干文章盼望各人以后多多支持草根技能分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作