Проблема с функцией переименования словарей в словаре в конструкторе из интерфейса

В общем, есть интерфейс 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 шт):

Автор решения: AddmiX

В общем 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()
→ Ссылка