Могу ли я хранить все конопки, виджеты и текстреи в отдельном файле?
У меня в шаблоне есть повторяющиеся куски кода и что бы оптимизировать код я хочу разделить шаблон на несколько частей и загружать в зависимости от того что запрашивает пользователь. Например я хочу вставить кнопки #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 шт):
Вы можете делать все в пределах разумного. Я бы сделал это так:
Создал класс
Qt_array_butзакачал тудаUi_array_butПодключил его в классе
QtMainWindowself.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 и что бы на них распространялась одинаковая логика.
Фон добавил, смотрите
app.setStyleSheet(StyleSheet)Все объекты уникальны используйте из где вам надо, но вставить три раза кнопку 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_())

