Проблема с функцией переименования словарей в словаре в конструкторе из интерфейса
В общем, есть интерфейс Question.py (кода много, для примера можно просто скопировать):
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(678, 824)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3")
self.calc_button = QtWidgets.QPushButton(self.centralwidget)
font = QtGui.QFont()
font.setFamily("Times New Roman")
font.setPointSize(12)
self.calc_button.setFont(font)
self.calc_button.setStyleSheet("background-color: rgb(213, 213, 213);")
self.calc_button.setObjectName("calc_button")
self.gridLayout_3.addWidget(self.calc_button, 2, 1, 1, 1)
self.line = QtWidgets.QFrame(self.centralwidget)
self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.line.setObjectName("line")
self.gridLayout_3.addWidget(self.line, 1, 0, 1, 2)
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
self.tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.North)
self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded)
self.tabWidget.setObjectName("tabWidget")
self.tab_bvr = QtWidgets.QWidget()
self.tab_bvr.setMaximumSize(QtCore.QSize(16777215, 1359))
self.tab_bvr.setObjectName("tab_bvr")
self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_bvr)
self.gridLayout_4.setObjectName("gridLayout_4")
self.scrollArea_bvr = QtWidgets.QScrollArea(self.tab_bvr)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.scrollArea_bvr.sizePolicy().hasHeightForWidth())
self.scrollArea_bvr.setSizePolicy(sizePolicy)
self.scrollArea_bvr.setMouseTracking(False)
self.scrollArea_bvr.setAccessibleDescription("")
self.scrollArea_bvr.setWidgetResizable(True)
self.scrollArea_bvr.setObjectName("scrollArea_bvr")
self.scrollAreaWidget_bvr = QtWidgets.QWidget()
self.scrollAreaWidget_bvr.setGeometry(QtCore.QRect(0, 0, 634, 677))
self.scrollAreaWidget_bvr.setAutoFillBackground(True)
self.scrollAreaWidget_bvr.setObjectName("scrollAreaWidget_bvr")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidget_bvr)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.subtabs_bvr = QtWidgets.QTabWidget(self.scrollAreaWidget_bvr)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.subtabs_bvr.sizePolicy().hasHeightForWidth())
self.subtabs_bvr.setSizePolicy(sizePolicy)
self.subtabs_bvr.setAutoFillBackground(False)
self.subtabs_bvr.setTabPosition(QtWidgets.QTabWidget.TabPosition.North)
self.subtabs_bvr.setElideMode(QtCore.Qt.TextElideMode.ElideNone)
self.subtabs_bvr.setUsesScrollButtons(True)
self.subtabs_bvr.setObjectName("subtabs_bvr")
self.tab_bvr_overall = QtWidgets.QWidget()
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tab_bvr_overall.sizePolicy().hasHeightForWidth())
self.tab_bvr_overall.setSizePolicy(sizePolicy)
self.tab_bvr_overall.setMinimumSize(QtCore.QSize(0, 0))
self.tab_bvr_overall.setMaximumSize(QtCore.QSize(16777215, 400))
self.tab_bvr_overall.setAcceptDrops(True)
self.tab_bvr_overall.setAutoFillBackground(False)
self.tab_bvr_overall.setObjectName("tab_bvr_overall")
self.gridLayout = QtWidgets.QGridLayout(self.tab_bvr_overall)
self.gridLayout.setObjectName("gridLayout")
self.InputData_overall = QtWidgets.QScrollArea(self.tab_bvr_overall)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.InputData_overall.sizePolicy().hasHeightForWidth())
self.InputData_overall.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias)
self.InputData_overall.setFont(font)
self.InputData_overall.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor))
self.InputData_overall.setMouseTracking(False)
self.InputData_overall.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.DefaultContextMenu)
self.InputData_overall.setAccessibleDescription("")
self.InputData_overall.setAutoFillBackground(False)
self.InputData_overall.setStyleSheet("")
self.InputData_overall.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken)
self.InputData_overall.setLineWidth(1)
self.InputData_overall.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarPolicy.ScrollBarAsNeeded)
self.InputData_overall.setWidgetResizable(True)
self.InputData_overall.setObjectName("InputData_overall")
self.scrollArea_overall = QtWidgets.QWidget()
self.scrollArea_overall.setEnabled(True)
self.scrollArea_overall.setGeometry(QtCore.QRect(0, 0, 590, 380))
self.scrollArea_overall.setObjectName("scrollArea_overall")
self.gridLayout_2 = QtWidgets.QGridLayout(self.scrollArea_overall)
self.gridLayout_2.setObjectName("gridLayout_2")
self.input_overall_2 = QtWidgets.QDoubleSpinBox(self.scrollArea_overall)
self.input_overall_2.setMaximumSize(QtCore.QSize(75, 16777215))
self.input_overall_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.input_overall_2.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
self.input_overall_2.setPrefix("")
self.input_overall_2.setSuffix("")
self.input_overall_2.setDecimals(0)
self.input_overall_2.setMaximum(3001.0)
self.input_overall_2.setProperty("value", 0.0)
self.input_overall_2.setObjectName("input_overall_2")
self.gridLayout_2.addWidget(self.input_overall_2, 1, 0, 1, 1)
self.input_overall_1 = QtWidgets.QDoubleSpinBox(self.scrollArea_overall)
self.input_overall_1.setMaximumSize(QtCore.QSize(75, 16777215))
self.input_overall_1.setAutoFillBackground(False)
self.input_overall_1.setWrapping(True)
self.input_overall_1.setFrame(True)
self.input_overall_1.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.input_overall_1.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
self.input_overall_1.setSpecialValueText("")
self.input_overall_1.setCorrectionMode(QtWidgets.QAbstractSpinBox.CorrectionMode.CorrectToPreviousValue)
self.input_overall_1.setPrefix("")
self.input_overall_1.setSuffix("")
self.input_overall_1.setMaximum(3000.99)
self.input_overall_1.setObjectName("input_overall_1")
self.gridLayout_2.addWidget(self.input_overall_1, 0, 0, 1, 1)
self.InputData_overall.setWidget(self.scrollArea_overall)
self.gridLayout.addWidget(self.InputData_overall, 0, 0, 1, 1)
self.subtabs_bvr.addTab(self.tab_bvr_overall, "")
self.tab_bvr_drilling = QtWidgets.QWidget()
self.tab_bvr_drilling.setMaximumSize(QtCore.QSize(16777215, 280))
self.tab_bvr_drilling.setObjectName("tab_bvr_drilling")
self.gridLayout_6 = QtWidgets.QGridLayout(self.tab_bvr_drilling)
self.gridLayout_6.setObjectName("gridLayout_6")
self.InputData_drilling = QtWidgets.QScrollArea(self.tab_bvr_drilling)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.InputData_drilling.sizePolicy().hasHeightForWidth())
self.InputData_drilling.setSizePolicy(sizePolicy)
self.InputData_drilling.setMaximumSize(QtCore.QSize(16777215, 16777215))
font = QtGui.QFont()
font.setFamily("MS Serif")
font.setStyleStrategy(QtGui.QFont.StyleStrategy.PreferAntialias)
self.InputData_drilling.setFont(font)
self.InputData_drilling.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.SizeAdjustPolicy.AdjustIgnored)
self.InputData_drilling.setWidgetResizable(True)
self.InputData_drilling.setObjectName("InputData_drilling")
self.scrollArea_drilling = QtWidgets.QWidget()
self.scrollArea_drilling.setGeometry(QtCore.QRect(0, 0, 590, 260))
self.scrollArea_drilling.setObjectName("scrollArea_drilling")
self.gridLayout_5 = QtWidgets.QGridLayout(self.scrollArea_drilling)
self.gridLayout_5.setObjectName("gridLayout_5")
self.input_drilling_2 = QtWidgets.QDoubleSpinBox(self.scrollArea_drilling)
self.input_drilling_2.setMaximumSize(QtCore.QSize(75, 16777215))
font = QtGui.QFont()
font.setFamily("MS Shell Dlg 2")
self.input_drilling_2.setFont(font)
self.input_drilling_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.input_drilling_2.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
self.input_drilling_2.setMaximum(3000.99)
self.input_drilling_2.setObjectName("input_drilling_2")
self.gridLayout_5.addWidget(self.input_drilling_2, 1, 0, 1, 1)
self.input_drilling_3 = QtWidgets.QDoubleSpinBox(self.scrollArea_drilling)
self.input_drilling_3.setMaximumSize(QtCore.QSize(75, 16777215))
font = QtGui.QFont()
font.setFamily("MS Shell Dlg 2")
self.input_drilling_3.setFont(font)
self.input_drilling_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.input_drilling_3.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
self.input_drilling_3.setMaximum(3000.99)
self.input_drilling_3.setObjectName("input_drilling_3")
self.gridLayout_5.addWidget(self.input_drilling_3, 2, 0, 1, 1)
self.input_drilling_1 = QtWidgets.QDoubleSpinBox(self.scrollArea_drilling)
self.input_drilling_1.setMaximumSize(QtCore.QSize(75, 16777215))
font = QtGui.QFont()
font.setFamily("MS Shell Dlg 2")
self.input_drilling_1.setFont(font)
self.input_drilling_1.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.input_drilling_1.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.NoButtons)
self.input_drilling_1.setMaximum(3000.99)
self.input_drilling_1.setObjectName("input_drilling_1")
self.gridLayout_5.addWidget(self.input_drilling_1, 0, 0, 1, 1)
self.InputData_drilling.setWidget(self.scrollArea_drilling)
self.gridLayout_6.addWidget(self.InputData_drilling, 0, 0, 1, 1)
self.subtabs_bvr.addTab(self.tab_bvr_drilling, "")
self.verticalLayout_2.addWidget(self.subtabs_bvr)
self.scrollArea_bvr.setWidget(self.scrollAreaWidget_bvr)
self.gridLayout_4.addWidget(self.scrollArea_bvr, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_bvr, "")
self.gridLayout_3.addWidget(self.tabWidget, 0, 0, 1, 2)
self.line.raise_()
self.tabWidget.raise_()
self.calc_button.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 678, 21))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
self.menuTools = QtWidgets.QMenu(self.menubar)
self.menuTools.setObjectName("menuTools")
self.menuCalculate = QtWidgets.QMenu(self.menubar)
self.menuCalculate.setObjectName("menuCalculate")
self.menuInfo = QtWidgets.QMenu(self.menubar)
self.menuInfo.setObjectName("menuInfo")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.actionNew = QtGui.QAction(MainWindow)
self.actionNew.setObjectName("actionNew")
self.actionOpen = QtGui.QAction(MainWindow)
self.actionOpen.setObjectName("actionOpen")
self.actionSave = QtGui.QAction(MainWindow)
self.actionSave.setObjectName("actionSave")
self.actionSave_as = QtGui.QAction(MainWindow)
self.actionSave_as.setObjectName("actionSave_as")
self.actionExit = QtGui.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
self.actionImport = QtGui.QAction(MainWindow)
self.actionImport.setObjectName("actionImport")
self.actionExport = QtGui.QAction(MainWindow)
self.actionExport.setObjectName("actionExport")
self.actionEdit = QtGui.QAction(MainWindow)
self.actionEdit.setObjectName("actionEdit")
self.actionCalculate_all = QtGui.QAction(MainWindow)
self.actionCalculate_all.setObjectName("actionCalculate_all")
self.actionGlossary = QtGui.QAction(MainWindow)
self.actionGlossary.setObjectName("actionGlossary")
self.actionHelp = QtGui.QAction(MainWindow)
self.actionHelp.setObjectName("actionHelp")
self.actionAbout_GeoGraph = QtGui.QAction(MainWindow)
self.actionAbout_GeoGraph.setObjectName("actionAbout_GeoGraph")
self.menuFile.addAction(self.actionNew)
self.menuFile.addAction(self.actionOpen)
self.menuFile.addAction(self.actionSave)
self.menuFile.addAction(self.actionSave_as)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionImport)
self.menuFile.addAction(self.actionExport)
self.menuFile.addSeparator()
self.menuFile.addAction(self.actionExit)
self.menuFile.addSeparator()
self.menuTools.addAction(self.actionEdit)
self.menuCalculate.addAction(self.actionCalculate_all)
self.menuInfo.addAction(self.actionGlossary)
self.menuInfo.addAction(self.actionHelp)
self.menuInfo.addAction(self.actionAbout_GeoGraph)
self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuTools.menuAction())
self.menubar.addAction(self.menuCalculate.menuAction())
self.menubar.addAction(self.menuInfo.menuAction())
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
self.subtabs_bvr.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "GeoGraph 0.0.1.3"))
self.calc_button.setText(_translate("MainWindow", "Button"))
self.subtabs_bvr.setTabText(self.subtabs_bvr.indexOf(self.tab_bvr_overall), _translate("MainWindow", "tab_1"))
self.subtabs_bvr.setTabText(self.subtabs_bvr.indexOf(self.tab_bvr_drilling), _translate("MainWindow", "tab_2"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_bvr), _translate("MainWindow", "main_tab"))
self.menuFile.setTitle(_translate("MainWindow", "File"))
self.menuTools.setTitle(_translate("MainWindow", "Tools"))
self.menuCalculate.setTitle(_translate("MainWindow", "Calculate"))
self.menuInfo.setTitle(_translate("MainWindow", "Info"))
self.actionNew.setText(_translate("MainWindow", "New"))
self.actionOpen.setText(_translate("MainWindow", "Open"))
self.actionSave.setText(_translate("MainWindow", "Save"))
self.actionSave_as.setText(_translate("MainWindow", "Save as"))
self.actionExit.setText(_translate("MainWindow", "Exit"))
self.actionImport.setText(_translate("MainWindow", "Import..."))
self.actionExport.setText(_translate("MainWindow", "Export..."))
self.actionEdit.setText(_translate("MainWindow", "Edit"))
self.actionCalculate_all.setText(_translate("MainWindow", "Calculate all"))
self.actionGlossary.setText(_translate("MainWindow", "Glossary"))
self.actionHelp.setText(_translate("MainWindow", "Help"))
self.actionAbout_GeoGraph.setText(_translate("MainWindow", "About GeoGraph"))
К нему написал функцию, чтобы автоматически определялось количество вкладок на странице, содержание ячеек и их количество на каждой вкладке. Рабочий код представлен ниже:
import Question as interf
from PyQt6 import QtCore,QtWidgets,QtGui
import pprint
class MainWindow(QtWidgets.QMainWindow):
def __init__(self,parent=None):
super(MainWindow, self).__init__(parent)
self.ui = interf.Ui_MainWindow()
self.ui.setupUi(self)
#auto refresh data_bvr_overall:
self.ui.Tabs = self.ui.scrollAreaWidget_bvr.findChildren(QtWidgets.QScrollArea)
self.tabval = [0.0] * len(self.ui.Tabs)
self.tabdict = dict(zip(self.ui.Tabs,self.tabval))
index = 0
self.tablist = []
for i in self.ui.Tabs:
self.tablist.append(index)
index +=1
#скрипт проверки изменений и создания большого словаря
for i in self.tablist:
k = self.ui.Tabs[i].findChildren(QtWidgets.QDoubleSpinBox)
vals = [0.0] * (len(k))
self.valdict = dict(zip(k,vals)) #здесь готов словарь значений текущей вкладки и после этого его нужно вставить в основной словарь
self.tabdict.update({self.ui.Tabs[i]: self.valdict})
for l in self.ui.Tabs[i].findChildren(QtWidgets.QDoubleSpinBox):
l.valueChanged.connect(lambda val, l=l:self.upd_vallists(val,l))
#calculation execute
self.ui.calc_button.clicked.connect(self.on_clicked)
def upd_vallists(self,val,l):
print("Value changed!")
for i in self.tablist:
k = self.tabdict[self.ui.Tabs[i]]
for j in list(k.keys()):
if l == j:
k.update({l:val})
else:
continue
#giving dict keys correct name and order FIXME
def on_clicked(self):
print("Calculation started!")
self.upd_tabdict = self.tabdict.copy()
for i in self.tablist:
self.kk = (list(self.upd_tabdict.keys())[i])
# pprint.pprint(self.kk)
self.kn = list(self.upd_tabdict[self.kk].keys())
# pprint.pprint(self.kn)
self.kd = self.upd_tabdict[self.kk]
# pprint.pprint(self.kd)
# input()
for u in self.kn:
(self.kd)[u.objectName()] = (self.kd).pop(u)
for i in list(self.upd_tabdict.keys()):
self.upd_tabdict[i.objectName()] = self.upd_tabdict.pop(i)
pprint.pprint(self.tabdict)
pprint.pprint(self.upd_tabdict)
if __name__== "__main__":
import sys
app = interf.QtWidgets.QApplication(sys.argv)
Form = MainWindow()
Form.show()
sys.exit(app.exec())
То есть каждый раз когда в ячейке изменяется числа, программа считывать его и хранит в специальном словаре tabdict, где ключи это вкладки а значения - другие словари с клюами из названий ячеек, а в качестве значений их содержимое. Всё это работает, до тех пор пока я не вызываю метод on_clicked который должен переименовать объекты в словарях в их первоночальное название. А теперь вопрос: почему у меня словарь tabdict при переименовании ячеек меняет значения также как его КОПИЯ upd_tabdict. Если запустить файл функций, то в консоль выведутся результаты и будет понятно что там происходит.
Ответы (1 шт):
В общем deepcopy() сдесь делу не помог, потому что копируются словари с объектами PyQt, так что я просто написал ручное копирование с применением из модуля copy метода copy.copy():
for i in self.tablist:
self.kk = list(self.tabdict.keys())
self.upd_nvals = [0.0] * len(list(self.tabdict.keys()))
self.upd_tabdict = dict(zip(self.kk,self.upd_nvals))
for u in self.kk:
self.kn = copy.copy(self.tabdict[u])
self.upd_tabdict.update({u: self.kn})
self.kk.clear()
self.upd_nvals.clear()