python - 如何避免在 PyQt5 中打开两个窗口?
问题描述
使用我的第一个脚本,我根据需要创建了一个布局。现在我想在第二个脚本中使用这个布局并将小部件添加到框架中。面临以下问题:第一个和第二个程序窗口将同时打开,我只想打开/显示我的第二个程序窗口。如何解决?
第一个脚本
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QFrame, QHBoxLayout, QSizePolicy
class MsgBox111(QWidget):
def __init__(self):
super().__init__()
self.frame_main = QFrame()
self.frame_main.setObjectName("ob_frame_main")
self.frame_main.setStyleSheet("QFrame#ob_frame_main{background-color:green}")
self.frame_left_top = QFrame()
self.frame_left_top.setObjectName("ob_frame_left_top")
self.frame_left_top.setStyleSheet("QFrame#ob_frame_left_top{background-color:skyblue}")
self.frame_left_top.setMinimumSize(600, 340)
self.frame_left_bot = QFrame()
self.frame_left_bot.setObjectName("ob_frame_left_bot")
self.frame_left_bot.setStyleSheet("QFrame#ob_frame_left_bot{background-color:lightgreen}")
self.frame_left_bot.setFixedSize(600, 60)
self.frame_right = QFrame()
self.frame_right.setObjectName("ob_frame_right")
self.frame_right.setStyleSheet("QFrame#ob_frame_right{background-color:rgb(230,220,150)}")
self.frame_right.setFixedSize(200, 405)
self.lay_main = QHBoxLayout()
self.lay_main.setContentsMargins(0, 0, 0, 0)
self.lay_main.setSpacing(8)
self.lay_left = QVBoxLayout()
self.lay_left.setSpacing(8)
self.lay_left_top = QVBoxLayout()
self.lay_left_top.setContentsMargins(0, 0, 0, 0)
self.lay_left_bot = QHBoxLayout()
self.lay_left_bot.setContentsMargins(0, 0, 0, 0)
self.lay_right = QVBoxLayout()
self.lay_right.setContentsMargins(0, 0, 0, 0)
self.lay_overall = QHBoxLayout()
self.lay_overall.setContentsMargins(0, 0, 0, 0)
self.lay_overall.setSpacing(5)
self.lay_left_top = QVBoxLayout(self.frame_left_top)
self.lay_left_bot = QHBoxLayout(self.frame_left_bot)
self.lay_right = QVBoxLayout(self.frame_right)
self.lay_main = QHBoxLayout(self.frame_main)
self.lay_left.addWidget(self.frame_left_top)
self.lay_left.addWidget(self.frame_left_bot)
self.lay_main.addLayout(self.lay_left)
self.lay_main.addWidget(self.frame_right)
self.lay_overall.addWidget(self.frame_main)
self.setLayout(self.lay_overall)
frame_right_sizehint = self.lay_left.sizeHint()
self.frame_right.setFixedSize(260, frame_right_sizehint.height())
self.frame_main.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
第二个脚本
import sys
from PyQt5.QtWidgets import QLineEdit
from layour_sample_001 import *
class MsgBox222(QWidget):
def __init__(self):
super().__init__()
self.ss = MsgBox111()
self.ss.show()
self.tb = QLineEdit()
self.ss.lay_left.addWidget(self.tb)
self.ss.setLayout(self.ss.lay_left)
if __name__ == "__main__":
app = QApplication(sys.argv)
mainwindow = MsgBox222()
mainwindow.show()
sys.exit(app.exec_())
解决方案
您需要正确子类化.
在__init__
为超类调用之后,您可以访问该类和实例的所有继承属性:您拥有一个完全构造的MsgBox111
实例,然后您可以根据需要对其进行扩展。
class MsgBox222(MsgBox111):
def __init__(self):
super().__init__()
self.tb = QLineEdit()
self.lay_left.addWidget(self.tb)
我强烈建议你对 OOP 的主要方面做更多的研究和仔细研究,包括类、实例、继承、属性和子类化,因为这些基本主题的知识是强制性的。
推荐阅读
- pdf - 使用 OpenPDF 的 PDF 每一页上的矩形页眉和页脚块
- python - 在 Python 中连接两个字符串的最快方法
- excel - 如何在使用“X”按钮关闭第二个用户表单后显示用户表单(终止事件中断代码)
- python - 从数据框生成网络图
- kubernetes - 初始化 Kubernetes 集群时如何指定网络接口?
- r - Returning a true value if it is a close match among different columns in r
- javascript - MetaMask - RPC 错误:权限请求已经挂起,在 Angular 10 中
- node.js - onEndReached FlatList React Native
- python - 如何在列表理解中将变量添加到 for 循环
- laravel - Laravel Fortify + Inertia + vue 如何添加角色和权限?