首页 > 解决方案 > 如何避免在 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_())

标签: pythonpyqtpyqt5

解决方案


您需要正确子类化.
__init__为超类调用之后,您可以访问该类和实例的所有继承属性:您拥有一个完全构造的MsgBox111实例,然后您可以根据需要对其进行扩展。

class MsgBox222(MsgBox111):

    def __init__(self):
        super().__init__()

        self.tb = QLineEdit()
        self.lay_left.addWidget(self.tb)

强烈建议你对 OOP 的主要方面做更多的研究和仔细研究,包括类、实例、继承、属性和子类化,因为这些基本主题的知识是强制性的。


推荐阅读