Могу ли я хранить все конопки, виджеты и текстреи в отдельном файле?

У меня в шаблоне есть повторяющиеся куски кода и что бы оптимизировать код я хочу разделить шаблон на несколько частей и загружать в зависимости от того что запрашивает пользователь. Например я хочу вставить кнопки #but_1, #but_1, #but_2, #but_1 из test2 во внутрь #smile_window_tes. слева от #label

test1.py

from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QFont,
    QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
    QRadialGradient)
from PySide2.QtWidgets import *

class Ui_Windows_main(object):
    def setupUi(self, Windows_main):
        if Windows_main.objectName():
            Windows_main.setObjectName(u"Windows_main")
        Windows_main.resize(764, 604)
        Windows_main.setStyleSheet(u"\n"
"\n"
"#Test_window #Window_test{\n"
"background-color: rgb(239, 41, 41);\n"
"}
"#Test_window #smile_window_tes{\n"
"background-color: #fff;\n"
"}\n"
"")
        self.Test_window = QWidget(Windows_main)
        self.Test_window.setObjectName(u"Test_window")
        self.Test_window.setEnabled(True)
        self.Test_window.setTabletTracking(False)
        self.gridLayout = QGridLayout(self.Test_window)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalSpacer = QSpacerItem(20, 142, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout.addItem(self.verticalSpacer, 0, 1, 1, 1)

        self.horizontalSpacer = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout.addItem(self.horizontalSpacer, 1, 0, 1, 1)

        self.Window_test = QWidget(self.Test_window)
        self.Window_test.setObjectName(u"Window_test")
        self.Window_test.setMinimumSize(QSize(250, 250))
        self.Window_test.setStyleSheet(u"")
        self.verticalLayout = QVBoxLayout(self.Window_test)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.Text = QLabel(self.Window_test)
        self.Text.setObjectName(u"Text")
        font = QFont()
        font.setPointSize(21)
        self.Text.setFont(font)
        self.Text.setAlignment(Qt.AlignCenter)

        self.verticalLayout.addWidget(self.Text)

        self.smile_window_tes = QWidget(self.Window_test)
        self.smile_window_tes.setObjectName(u"smile_window_tes")
        self.gridLayout_2 = QGridLayout(self.smile_window_tes)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.label = QLabel(self.smile_window_tes)
        self.label.setObjectName(u"label")

        self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)


        self.verticalLayout.addWidget(self.smile_window_tes)

        self.verticalLayout.setStretch(1, 1)

        self.gridLayout.addWidget(self.Window_test, 1, 1, 1, 1)

        self.verticalSpacer_2 = QSpacerItem(20, 141, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout.addItem(self.verticalSpacer_2, 2, 1, 1, 1)

        self.horizontalSpacer_2 = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout.addItem(self.horizontalSpacer_2, 1, 2, 1, 1)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(2, 1)
        self.gridLayout.setColumnStretch(0, 1)
        self.gridLayout.setColumnStretch(2, 1)
        Windows_main.setCentralWidget(self.Test_window)
        self.menubar = QMenuBar(Windows_main)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 764, 22))
        Windows_main.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(Windows_main)
        self.statusbar.setObjectName(u"statusbar")
        Windows_main.setStatusBar(self.statusbar)

        self.retranslateUi(Windows_main)

        QMetaObject.connectSlotsByName(Windows_main)
    # setupUi

    def retranslateUi(self, Windows_main):
        Windows_main.setWindowTitle(QCoreApplication.translate("Windows_main", u"MainWindow", None))
        self.Text.setText(QCoreApplication.translate("Windows_main", u"Text", None))
        self.label.setText(QCoreApplication.translate("Windows_main", u"TextLabel", None))
    # retranslateUi

test2.py

from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QFont,
    QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
    QRadialGradient)
from PySide2.QtWidgets import *

class Ui_array_but(object):
    def setupUi(self, array_but):
        if array_but.objectName():
            array_but.setObjectName(u"array_but")
        array_but.resize(800, 583)
        array_but.setStyleSheet(u"#but_1{\n"
"background:rgb(243, 255, 11)\n"
"}\n"
"\n"
"#but_2{\n"
"background:rgb(56, 255, 239)\n"
"}")
        self.centralwidget = QWidget(array_but)
        self.centralwidget.setObjectName(u"centralwidget")
        self.but_1 = QRadioButton(self.centralwidget)
        self.but_1.setObjectName(u"but_1")
        self.but_1.setGeometry(QRect(0, 10, 83, 18))
        self.but_2 = QRadioButton(self.centralwidget)
        self.but_2.setObjectName(u"but_2")
        self.but_2.setGeometry(QRect(0, 40, 83, 18))
        array_but.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(array_but)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 800, 22))
        array_but.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(array_but)
        self.statusbar.setObjectName(u"statusbar")
        array_but.setStatusBar(self.statusbar)

        self.retranslateUi(array_but)

        QMetaObject.connectSlotsByName(array_but)
    # setupUi

    def retranslateUi(self, array_but):
        array_but.setWindowTitle(QCoreApplication.translate("array_but", u"MainWindow", None))
        self.but_1.setText(QCoreApplication.translate("array_but", u"But 1", None))
        self.but_2.setText(QCoreApplication.translate("array_but", u"But 2", None))
    # retranslateUi

Главный файл main.py

from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QFont,
    QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap,
    QRadialGradient)
from PySide2.QtWidgets import *

from PySide2.QtWidgets import QApplication,QWidget
import sys


from test1 import Ui_Windows_main
from test2 import Ui_array_but

class QtMainWindow(QMainWindow, Ui_Windows_main):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

if __name__ == '__main__':

    my = QApplication(sys.argv)
    window = QtMainWindow()
    window.show()

    sys.exit(my.exec_())

Как это сделать и вызовет ли это какие либо ошибки или конфликты имен? Я только начал изучать pyside поэтому и спрашиваю.


Ответы (1 шт):

Автор решения: S. Nick

Вы можете делать все в пределах разумного. Я бы сделал это так:

  1. Создал класс Qt_array_but закачал туда Ui_array_but

  2. Подключил его в классе QtMainWindow

    self.array_but = Qt_array_but(self)

Все, берите из него атрибуты какие вам надо и делайте с ними что-нибудь.


Обратите внимание, что вам надо будет поменять импорты, т.к. у меня PyQt5

Еще одно изменение, которое я внес - это строка

self.gridLayout_2.addWidget(self.label, 1, 1, 1, 1)

т.к. вы захотели вставит слева от #label

import sys
from PyQt5.Qt import  *


# from test2 import Ui_array_but
class Ui_array_but(object):
    def setupUi(self, array_but):
        if array_but.objectName():
            array_but.setObjectName(u"array_but")
        array_but.resize(800, 583)
        array_but.setStyleSheet(u"#but_1{\n"
"background:rgb(243, 255, 11)\n"
"}\n"
"\n"
"#but_2{\n"
"background:rgb(56, 255, 239)\n"
"}")
        self.centralwidget = QWidget(array_but)
        self.centralwidget.setObjectName(u"centralwidget")
        self.but_1 = QRadioButton(self.centralwidget)
        self.but_1.setObjectName(u"but_1")
        self.but_1.setGeometry(QRect(0, 10, 83, 18))
        self.but_2 = QRadioButton(self.centralwidget)
        self.but_2.setObjectName(u"but_2")
        self.but_2.setGeometry(QRect(0, 40, 83, 18))
        array_but.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(array_but)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 800, 22))
        array_but.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(array_but)
        self.statusbar.setObjectName(u"statusbar")
        array_but.setStatusBar(self.statusbar)

        self.retranslateUi(array_but)

        QMetaObject.connectSlotsByName(array_but)
    # setupUi

    def retranslateUi(self, array_but):
        array_but.setWindowTitle(QCoreApplication.translate("array_but", u"MainWindow", None))
        self.but_1.setText(QCoreApplication.translate("array_but", u"But 1", None))
        self.but_2.setText(QCoreApplication.translate("array_but", u"But 2", None))
    # retranslateUi


# from test1 import Ui_Windows_main    
class Ui_Windows_main(object):
    def setupUi(self, Windows_main):
        if Windows_main.objectName():
            Windows_main.setObjectName(u"Windows_main")
        Windows_main.resize(764, 604)
        Windows_main.setStyleSheet("""
            #Test_window #Window_test{
                background-color: rgb(239, 41, 41);
            }
            #Test_window #smile_window_tes{
                background-color: #fff;
            }
        """)
        self.Test_window = QWidget(Windows_main)
        self.Test_window.setObjectName(u"Test_window")
        self.Test_window.setEnabled(True)
        self.Test_window.setTabletTracking(False)
        self.gridLayout = QGridLayout(self.Test_window)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalSpacer = QSpacerItem(20, 142, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout.addItem(self.verticalSpacer, 0, 1, 1, 1)

        self.horizontalSpacer = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout.addItem(self.horizontalSpacer, 1, 0, 1, 1)

        self.Window_test = QWidget(self.Test_window)
        self.Window_test.setObjectName(u"Window_test")
        self.Window_test.setMinimumSize(QSize(250, 250))
        self.Window_test.setStyleSheet(u"")
        self.verticalLayout = QVBoxLayout(self.Window_test)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.Text = QLabel(self.Window_test)
        self.Text.setObjectName(u"Text")
        font = QFont()
        font.setPointSize(21)
        self.Text.setFont(font)
        self.Text.setAlignment(Qt.AlignCenter)

        self.verticalLayout.addWidget(self.Text)

        self.smile_window_tes = QWidget(self.Window_test)
        self.smile_window_tes.setObjectName(u"smile_window_tes")
        self.gridLayout_2 = QGridLayout(self.smile_window_tes)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.label = QLabel(self.smile_window_tes)
        self.label.setObjectName(u"label")

        self.gridLayout_2.addWidget(self.label, 1, 1, 1, 1)                    # 0, 0, 1, 1)

        self.verticalLayout.addWidget(self.smile_window_tes)
        self.verticalLayout.setStretch(1, 1)
        self.gridLayout.addWidget(self.Window_test, 1, 1, 1, 1)
        self.verticalSpacer_2 = QSpacerItem(20, 141, QSizePolicy.Minimum, QSizePolicy.Expanding)
        self.gridLayout.addItem(self.verticalSpacer_2, 2, 1, 1, 1)
        self.horizontalSpacer_2 = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.gridLayout.addItem(self.horizontalSpacer_2, 1, 2, 1, 1)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(2, 1)
        self.gridLayout.setColumnStretch(0, 1)
        self.gridLayout.setColumnStretch(2, 1)
        Windows_main.setCentralWidget(self.Test_window)
        self.menubar = QMenuBar(Windows_main)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 764, 22))
        Windows_main.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(Windows_main)
        self.statusbar.setObjectName(u"statusbar")
        Windows_main.setStatusBar(self.statusbar)

        self.retranslateUi(Windows_main)
        QMetaObject.connectSlotsByName(Windows_main)
    # setupUi

    def retranslateUi(self, Windows_main):
        Windows_main.setWindowTitle(QCoreApplication.translate("Windows_main", u"MainWindow", None))
        self.Text.setText(QCoreApplication.translate("Windows_main", u"Text", None))
        self.label.setText(QCoreApplication.translate("Windows_main", u"TextLabel", None))
    # retranslateUi


class Qt_array_but(QMainWindow, Ui_array_but):                                  # +++
    def __init__(self, parent=None):
        super(Qt_array_but, self).__init__(parent)

        self.setupUi(self)


class QtMainWindow(QMainWindow, Ui_Windows_main):   
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setupUi(self)

        self.array_but = Qt_array_but(self)                                      # +++

        self.gridLayout_2.addWidget(self.array_but.but_1, 0, 0, 1, 1,            # +++  
                                    alignment=Qt.AlignHCenter | Qt.AlignBottom)
        self.gridLayout_2.addWidget(self.array_but.but_2, 2, 0, 1, 1, 
                                    alignment=Qt.AlignCenter | Qt.AlignTop)      # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QtMainWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения


Update

А разве у but_1 не должен быть желтый фон, а у but_2 голубой?

И можно ли использовать несколько раз одну и туже кнопку, например вставить три раза кнопку but_1 и что бы на них распространялась одинаковая логика.

  1. Фон добавил, смотрите app.setStyleSheet(StyleSheet)

  2. Все объекты уникальны используйте из где вам надо, но вставить три раза кнопку but_1 - НЕ ПОЛУЧИТСЯ, вы ее увидите только в последнем, третьем месте. Вы ведь можете это проверить.


import sys
from PyQt5.Qt import  *



class Ui_array_but(object):
    def setupUi(self, array_but):
        if array_but.objectName():
            array_but.setObjectName(u"array_but")
        array_but.resize(800, 583)
        array_but.setStyleSheet(u"#but_1{\n"
"background:rgb(243, 255, 11)\n"
"}\n"
"\n"
"#but_2{\n"
"background:rgb(56, 255, 239)\n"
"}")
        self.centralwidget = QWidget(array_but)
        self.centralwidget.setObjectName(u"centralwidget")
        self.but_1 = QRadioButton(self.centralwidget)
        self.but_1.setObjectName(u"but_1")
        self.but_1.setGeometry(QRect(0, 10, 83, 18))
        self.but_2 = QRadioButton(self.centralwidget)
        self.but_2.setObjectName(u"but_2")
        self.but_2.setGeometry(QRect(0, 40, 83, 18))
        array_but.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(array_but)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 800, 22))
        array_but.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(array_but)
        self.statusbar.setObjectName(u"statusbar")
        array_but.setStatusBar(self.statusbar)

        self.retranslateUi(array_but)

        QMetaObject.connectSlotsByName(array_but)
    # setupUi

    def retranslateUi(self, array_but):
        array_but.setWindowTitle(QCoreApplication.translate("array_but", u"MainWindow", None))
        self.but_1.setText(QCoreApplication.translate("array_but", u"But 1", None))
        self.but_2.setText(QCoreApplication.translate("array_but", u"But 2", None))
    # retranslateUi


# from test1 import Ui_Windows_main    
class Ui_Windows_main(object):
    def setupUi(self, Windows_main):
        if Windows_main.objectName():
            Windows_main.setObjectName(u"Windows_main")
        Windows_main.resize(764, 604)
        Windows_main.setStyleSheet("""
            #Test_window #Window_test{
                background-color: rgb(239, 41, 41);
            }
            #Test_window #smile_window_tes{
                background-color: #fff;
            }
        """)
        self.Test_window = QWidget(Windows_main)
        self.Test_window.setObjectName(u"Test_window")
        self.Test_window.setEnabled(True)
        self.Test_window.setTabletTracking(False)
        self.gridLayout = QGridLayout(self.Test_window)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalSpacer = QSpacerItem(20, 142, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout.addItem(self.verticalSpacer, 0, 1, 1, 1)

        self.horizontalSpacer = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout.addItem(self.horizontalSpacer, 1, 0, 1, 1)

        self.Window_test = QWidget(self.Test_window)
        self.Window_test.setObjectName(u"Window_test")
        self.Window_test.setMinimumSize(QSize(250, 250))
        self.Window_test.setStyleSheet(u"")
        self.verticalLayout = QVBoxLayout(self.Window_test)
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.Text = QLabel(self.Window_test)
        self.Text.setObjectName(u"Text")
        font = QFont()
        font.setPointSize(21)
        self.Text.setFont(font)
        self.Text.setAlignment(Qt.AlignCenter)

        self.verticalLayout.addWidget(self.Text)

        self.smile_window_tes = QWidget(self.Window_test)
        self.smile_window_tes.setObjectName(u"smile_window_tes")
        self.gridLayout_2 = QGridLayout(self.smile_window_tes)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.label = QLabel(self.smile_window_tes)
        self.label.setObjectName(u"label")

        self.gridLayout_2.addWidget(self.label, 1, 1, 1, 1)                    # 0, 0, 1, 1)

        self.verticalLayout.addWidget(self.smile_window_tes)
        self.verticalLayout.setStretch(1, 1)
        self.gridLayout.addWidget(self.Window_test, 1, 1, 1, 1)
        self.verticalSpacer_2 = QSpacerItem(20, 141, QSizePolicy.Minimum, QSizePolicy.Expanding)
        self.gridLayout.addItem(self.verticalSpacer_2, 2, 1, 1, 1)
        self.horizontalSpacer_2 = QSpacerItem(254, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.gridLayout.addItem(self.horizontalSpacer_2, 1, 2, 1, 1)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(2, 1)
        self.gridLayout.setColumnStretch(0, 1)
        self.gridLayout.setColumnStretch(2, 1)
        Windows_main.setCentralWidget(self.Test_window)
        self.menubar = QMenuBar(Windows_main)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 764, 22))
        Windows_main.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(Windows_main)
        self.statusbar.setObjectName(u"statusbar")
        Windows_main.setStatusBar(self.statusbar)

        self.retranslateUi(Windows_main)
        QMetaObject.connectSlotsByName(Windows_main)
    # setupUi

    def retranslateUi(self, Windows_main):
        Windows_main.setWindowTitle(QCoreApplication.translate("Windows_main", u"MainWindow", None))
        self.Text.setText(QCoreApplication.translate("Windows_main", u"Text", None))
        self.label.setText(QCoreApplication.translate("Windows_main", u"TextLabel", None))
    # retranslateUi


class Qt_array_but(QMainWindow, Ui_array_but):                                  # +++
    def __init__(self, parent=None):
        super(Qt_array_but, self).__init__(parent)

        self.setupUi(self)


class QtMainWindow(QMainWindow, Ui_Windows_main):   
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setupUi(self)

        self.array_but = Qt_array_but()                                         # +++ self

        self.gridLayout_2.addWidget(self.array_but.but_1, 0, 0, 1, 1,            # +++  
                                    alignment=Qt.AlignHCenter | Qt.AlignBottom)
        self.gridLayout_2.addWidget(self.array_but.but_2, 2, 0, 1, 1, 
                                    alignment=Qt.AlignCenter | Qt.AlignTop)      # +++



# vvvvvvvv StyleSheet +++
StyleSheet = """
#but_1{
    background:rgb(243, 255, 11);
}
#but_2{
    background:rgb(56, 255, 239);
}
"""


if __name__ == '__main__':
    app = QApplication(sys.argv)

    app.setStyleSheet(StyleSheet)                    # <----- StyleSheet

    window = QtMainWindow()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка