После средней доработки кода и его сокращения до минимума, я снова пришел к точке, где, очевидно, я что-то упускаю. В общем, идея состоит в том, чтобы заполнить QTreeView данными из словаря, внести изменения в значения и затем загрузить обратно данные из QTreeView в словарь. Словарь является вложенным и пара ключ: значение может достигать другого уровня вниз.
Код следующий:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtGui
from PyQt5 import QtWidgets
"""
Define main Config window
"""
class guiWindowConfig(QtWidgets.QDialog):
def __init__(self):
super().__init__()
# Initialize dictionary
self.exe_initiate_dictionary()
# Initialize window
self.init_window()
# Initialize widgets
self.init_trvConfig()
self.init_btnDict2View()
self.init_btnView2Dict()
# Show window
self.show()
def init_window(self):
# Window config
self.int_left = 200
self.int_top = 100
self.int_width = 1000
self.int_height = 530
self.setWindowTitle("Define configuration variables")
self.setFixedSize(self.int_width, self.int_height)
self.move(self.int_left, self.int_top)
def init_trvConfig(self):
self.trvConfig = QtWidgets.QTreeView(self)
self.trvConfig.setGeometry(10, 10, 980, 400)
self.trvConfig.setUniformRowHeights(True)
self.trvConfig.setRootIsDecorated(True)
self.trvConfig.setAlternatingRowColors(True)
self.modConfig = QtGui.QStandardItemModel()
self.modConfig.setHorizontalHeaderLabels(['Variable', 'Value'])
self.trvConfig.setModel(self.modConfig)
self.trvConfig.header().setDefaultSectionSize(305)
def init_btnDict2View(self):
self.btnEditData = QtWidgets.QPushButton(self)
self.btnEditData.setGeometry(10, 480, 140, 40)
self.btnEditData.setText("Dictionary to QTreeView")
self.btnEditData.clicked.connect(self.slot_dict_2_view)
def init_btnView2Dict(self):
self.btnEditData = QtWidgets.QPushButton(self)
self.btnEditData.setGeometry(160, 480, 140, 40)
self.btnEditData.setText("QTreeView to Dictionary")
self.btnEditData.clicked.connect(self.slot_view_2_dict)
# ----------------------------------------------------------------------------------------------------
# Define slot functions
# ----------------------------------------------------------------------------------------------------
def slot_dict_2_view(self):
self.exe_treeview_from_dict(self.modConfig, self.data)
def slot_view_2_dict(self):
self.data = self.exe_dict_from_treeview()
pass
# ----------------------------------------------------------------------------------------------------
# Define core functions
# ----------------------------------------------------------------------------------------------------
def exe_initiate_dictionary(self):
self.data = {}
self.data["gui"] = {}
self.data["gui"]["color"] = {}
self.data["gui"]["color"]["active"] = "color: rgb(0, 0, 0); background-color: rgb(255, 255, 255)"
self.data["menu"] = {}
self.data["menu"]["submenu-1"] = True
self.data["menu"]["submenu-2"] = True
self.data["database"] = {}
self.data["database"]["main"] = {}
self.data["database"]["main"]["host"] = "localhost"
self.data["database"]["main"]["port"] = "1433"
self.data["database"]["main"]["database"] = "MAIN"
def exe_treeview_from_dict(self, parent_item, dictionary):
if isinstance(dictionary, dict):
for key, value in dictionary.items():
item_parent = QtGui.QStandardItem(str(key))
if isinstance(value, dict):
parent_item.appendRow(item_parent)
self.exe_treeview_from_dict(item_parent, value)
else:
item_child = QtGui.QStandardItem(str(value))
parent_item.appendRow([item_parent, item_child])
def exe_dict_from_model(self, parent_item, dictionary):
dict_value = {}
for int_cnt in range(self.modConfig.rowCount(parent_item)):
item_key = self.modConfig.index(int_cnt, 0, parent_item)
item_value = self.modConfig.index(int_cnt, 1, parent_item)
try:
dict_value = self.modConfig.itemFromIndex(item_value).data()
except:
dict_value = {}
self.exe_dict_from_model(item_key, dict_value)
dictionary[parent_item.data()] = dict_value
def exe_dict_from_treeview(self):
output_dictionary = dict()
for int_cnt in range(self.modConfig.rowCount()):
item_index = self.modConfig.index(int_cnt, 0)
self.exe_dict_from_model(item_index, output_dictionary)
return output_dictionary
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = guiWindowConfig()
window.show()
sys.exit(app.exec_())
Все, кроме функции
exe_dict_from_model
работает. Я знаю, что это рекуррентная функция, которая вызывает себя из своего тела, но не знаю, как изменить ее, чтобы она заработала.
Идея функций
exe_dict_from_treeview
exe_dict_from_model
- создать словарь, которыйреплицирует исходный словарь, созданный функцией
exe_initiate_dictionary
, но со значениями, измененными при редактировании QTreeView.