Python: Exiba um Dict of Dicts usando uma Árvore da interface do usuário para as chaves e qualquer outro widget para os valores

Tenho três ditados, um fornecendo uma lista de todas as opções disponíveis e dois fornecendo um subconjunto de opções (um conjunto para padrões e outro para opções do usuário). Eu recebo os três dict usando o analisador JSON incorporado do pytho

Eu quero exibir, em uma interface do usuário, uma árvore à esquerda com base nas chaves nos dictos, à direita, gostaria de exibir uma caixa de combinação, um botão, uma caixa de listagem ou algum outro widget apropriado para manipular os dados para essa chave. Preciso da árvore, pois estou realmente trabalhando com um ditado de ditados e quero permitir dobrar.

Até agora, procurei nas bibliotecas tkinter, tkk e tix do tkinter e elas permitem árvores, mas não permitem listas configuráveis à direita. Também vi alguns exemplos em que a árvore é emprestada do IDLE do python.

Existe um kit de ferramentas da GUI que fornece essa funcionalidade ou não existe, e eu tenho que criar meu própriSe eu tiver que criar meu próprio projeto, existe algum kit de ferramentas GUI que você recomendaria sobre t Existe um tutorial básico sobre o design da GUI para o kit de ferramentas recomendado, se ele não fornecer esse tipo de cois

Eu preferiria se o kit de ferramentas da GUI fosse compatível com várias plataformas (* nix e win) e livre para distribuir, se possível. De interesse, existe um tutorial sobre a criação de widgets personalizados com o tk, tentei procurar, mas continuo sendo direcionado ao uso do widget do tk em vez do design do widget: s

Como um exemplo mínimo, deixei cair os ditados extras por enquanto e tenho o seguinte:

import json
import tkinter as tk
from tkinter import ttk
from pprint import pprint as pprint 

def JSONTree(Tree, Parent, Dictionery, TagList = []):
 for key in Dictionery : 
  if isinstance(Dictionery[key],dict): 
   Tree.insert(Parent, 'end', key, text = key)
   TagList.append(key)
   JSONTree(Tree, key, Dictionery[key], TagList)
   pprint(TagList)
  elif isinstance(Dictionery[key],list): 
   Tree.insert(Parent, 'end', key, text = key) # Still working on this
  else : 
   Tree.insert(Parent, 'end', key, text = key, value = Dictionery[key])

if __name__ == "__main__" :
 # Setup the root UI
 root = tk.Tk()
 root.title("JSON editor")
 root.columnconfigure(0, weight=1)
 root.rowconfigure(0, weight=1)
 # Setup Data
 Data = {"firstName": "John",
         "lastName": "Smith",
         "gender": "man",
         "age": 32,
         "address": {"streetAddress": "21 2nd Street",
                     "city": "New York",
                     "state": "NY",
                     "postalCode": "10021"},
         "phoneNumbers": [{ "type": "home", "number": "212 555-1234" },
                          { "type": "fax", "number": "646 555-4567" }]}
 # Setup the Frames
 TreeFrame = ttk.Frame(root, padding = "3")
 TreeFrame.grid(row = 0, column = 0, sticky = tk.NSEW)
 # Setup the Tree
 tree = ttk.Treeview(TreeFrame, columns = ('Values'))
 tree.column('Values', width = 100, anchor = 'center')
 tree.heading('Values', text = 'Values')
 JSONTree(tree, '', Data)
 tree.pack(fill=tk.BOTH, expand = 1)
 # Limit windows minimum dimensions
 root.update_idletasks()
 root.minsize(root.winfo_reqwidth(),root.winfo_reqheight())
 root.mainloop()

questionAnswers(2)

yourAnswerToTheQuestion