PyQt: рекурсивно добавляет детей в TreeWidget динамически

Я хочу создать QTreeWidget с файлом JSON, который содержит несколько уровней поколений семейств, используя рекурсию. Вот мой код:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtWidgets
from PyQt5 import QtCore
import json
#read in JSON family structure
def readJsonData(fileName):
    with open(fileName) as json_data:
        treeData = json.load( json_data )
    return treeData   

fileName = 'family.json'     

d = readJsonData(fileName)

myList = []
def myprint( d, myList ):
  for k, v in d.items():
    if isinstance(v, dict):
      myprint(v, myList )
      myList.append(k)
    else:
      myList.append(k)
  return myList

a = myprint(d, myList )

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.tree = QTreeWidget(self)

        self.tree.setSelectionMode(QAbstractItemView.SingleSelection)

        editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
        self.setCentralWidget(self.tree)
        self.tree.setHeaderLabel('Tree')
        i = QTreeWidgetItem(self.tree, [a[len(a)-1]])
        a.pop()
        self.tree.addTopLevelItem(i)
        for x in a:
            QTreeWidgetItem(i, ['{}'.format(x)])

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

Это создает семейное дерево с корнем mainMenu и членами как:

['grandChild12',
 'grandChild11',
 'Child1',
 'grandChild21',
 'grandChild22',
 'Child2',
 'grandChild31',
 'grandChild32',
 'Child3']

Но результат должен быть вложен как структура файла JSON:

'mainMenu':
   'Child1'
       'grandChild11'
       'grandChild12'
   'Child2'
       'grandChild21'
       'grandChild22'
   'Child3'
       'grandChild31'
       'grandChild32'

Как настроить линию:

for x in a:
    QTreeWidgetItem(i, ['{}'.format(x)])

создать правильную структуру с рекурсией? Я делал это раньше на Java, поэтому я знаю, что это можно сделать, подняв конечность до узла и до конечного листа, либо слева, либо центра или справа от основного стебля.

Файл JSON представлен ниже:

{
  "mainMenu": {
    "Child1": {
      "grandChild11": "None",
      "grandChild12": "None"
    },
    "Child2": {
      "grandChild21": "None",
      "grandChild22": "None"
    },
    "Child3": {
      "grandChild31": "xx",
      "grandChild32": "xy"
    }
  }
}

python,json,python-3.x,recursion,qtreewidget,

0

Ответов: 0

PyQt: рекурсивно добавляет детей в TreeWidget динамически

Я хочу создать QTreeWidget с файлом JSON, который содержит несколько уровней поколений семейств, используя рекурсию. Вот мой код:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import QtWidgets
from PyQt5 import QtCore
import json
#read in JSON family structure
def readJsonData(fileName):
    with open(fileName) as json_data:
        treeData = json.load( json_data )
    return treeData   

fileName = 'family.json'     

d = readJsonData(fileName)

myList = []
def myprint( d, myList ):
  for k, v in d.items():
    if isinstance(v, dict):
      myprint(v, myList )
      myList.append(k)
    else:
      myList.append(k)
  return myList

a = myprint(d, myList )

class MyMainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyMainWindow, self).__init__(parent)
        self.tree = QTreeWidget(self)

        self.tree.setSelectionMode(QAbstractItemView.SingleSelection)

        editKey = QShortcut(QKeySequence(Qt.Key_Return), self.tree)
        self.setCentralWidget(self.tree)
        self.tree.setHeaderLabel('Tree')
        i = QTreeWidgetItem(self.tree, [a[len(a)-1]])
        a.pop()
        self.tree.addTopLevelItem(i)
        for x in a:
            QTreeWidgetItem(i, ['{}'.format(x)])

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ui = MyMainWindow()
    ui.show()
    sys.exit(app.exec_())

Это создает семейное дерево с корнем mainMenu и членами как:

['grandChild12',
 'grandChild11',
 'Child1',
 'grandChild21',
 'grandChild22',
 'Child2',
 'grandChild31',
 'grandChild32',
 'Child3']

Но результат должен быть вложен как структура файла JSON:

'mainMenu':
   'Child1'
       'grandChild11'
       'grandChild12'
   'Child2'
       'grandChild21'
       'grandChild22'
   'Child3'
       'grandChild31'
       'grandChild32'

Как настроить линию:

for x in a:
    QTreeWidgetItem(i, ['{}'.format(x)])

создать правильную структуру с рекурсией? Я делал это раньше на Java, поэтому я знаю, что это можно сделать, подняв конечность до узла и до конечного листа, либо слева, либо центра или справа от основного стебля.

Файл JSON представлен ниже:

{
  "mainMenu": {
    "Child1": {
      "grandChild11": "None",
      "grandChild12": "None"
    },
    "Child2": {
      "grandChild21": "None",
      "grandChild22": "None"
    },
    "Child3": {
      "grandChild31": "xx",
      "grandChild32": "xy"
    }
  }
}
00питон, JSON, питон-3.x, рекурсия, QTreeWidget,
Похожие вопросы