我有三个字典,一个提供所有可用选项的列表,两个提供选择的子集(一组用于默认值,一组用于用户选择)。我使用 python 内置的 JSON 解析器获得了三个字典。
我想在 UI 中显示左侧的树,它基于字典中的键,在右侧我想显示组合框、按钮、列表框或其他适当的小部件来操作数据那把钥匙。我需要这棵树,因为我真的在使用 dicts 的 dicts 并且我想允许折叠。
到目前为止,我已经研究了 tkinter、tkinter 的 ttk 和 tix 库,它们允许树,但不允许在右侧显示可配置列表。我还看到了一些从 python 的 IDLE 借用树的例子。
- 是否有提供此类功能的 GUI 工具包,或者没有这样的东西,我必须自己设计?
- 如果我必须自己设计,是否有任何 GUI 工具包可以推荐超过 tk ?
- 如果推荐的工具包不提供这种东西,是否有关于 GUI 设计的基本教程?
如果 GUI 工具包是跨平台兼容的(*nix 和 win)并且如果可能的话可以免费分发,我更喜欢它。出于兴趣,是否有关于使用 tk 创建自定义小部件的教程,我尝试过寻找,但我一直被定向到 tk 的小部件使用而不是小部件设计:s
作为一个最小的例子,我现在已经放弃了额外的 dicts 并具有以下内容:
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()