Skip to content

Instantly share code, notes, and snippets.

@hdary85
Created November 30, 2023 04:09
Show Gist options
  • Save hdary85/c27a34c304ba3615e7cb66f1f9aec4b5 to your computer and use it in GitHub Desktop.
Save hdary85/c27a34c304ba3615e7cb66f1f9aec4b5 to your computer and use it in GitHub Desktop.
import tkinter as tk
from tkinter import simpledialog, messagebox
class NestedDictManager:
def __init__(self, root):
self.root = root
self.root.title("Nested Dictionary Manager")
self.data = {
'key1': 'value1',
'key2': {
'key3': 'value3',
'key4': 'value4'
},
'key5': {
'key6': {
'key7': 'value7'
}
}
}
self.tree = tk.ttk.Treeview(self.root)
self.tree.pack(expand=tk.YES, fill=tk.BOTH)
self.tree["columns"] = ("value")
self.tree.column("#0", width=150, minwidth=25)
self.tree.column("value", width=150, minwidth=25)
self.tree.heading("#0", text="Key")
self.tree.heading("value", text="Value")
self.display_dict(self.data)
self.btn_frame = tk.Frame(self.root)
self.btn_frame.pack(pady=10)
self.update_btn = tk.Button(self.btn_frame, text="Update", command=self.update_key)
self.update_btn.pack(side=tk.LEFT, padx=5)
self.delete_btn = tk.Button(self.btn_frame, text="Delete", command=self.delete_key)
self.delete_btn.pack(side=tk.LEFT, padx=5)
self.rename_btn = tk.Button(self.btn_frame, text="Rename", command=self.rename_key)
self.rename_btn.pack(side=tk.LEFT, padx=5)
self.new_key_btn = tk.Button(self.btn_frame, text="New Key", command=self.add_new_key)
self.new_key_btn.pack(side=tk.LEFT, padx=5)
def display_dict(self, dictionary, parent=""):
for key, value in dictionary.items():
if isinstance(value, dict):
item = self.tree.insert(parent, "end", text=key)
self.display_dict(value, parent=item)
else:
self.tree.insert(parent, "end", text=key, values=(value,))
def update_key(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("Warning", "Please select a key to update.")
return
key = self.tree.item(selected_item)["text"]
new_value = simpledialog.askstring("Update Value", f"Enter new value for '{key}':")
if new_value is not None:
self.tree.item(selected_item, values=(new_value,))
def delete_key(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("Warning", "Please select a key to delete.")
return
confirm = messagebox.askyesno("Confirm Deletion", "Are you sure you want to delete this key?")
if confirm:
self.tree.delete(selected_item)
def rename_key(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("Warning", "Please select a key to rename.")
return
old_key = self.tree.item(selected_item)["text"]
new_key = simpledialog.askstring("Rename Key", f"Enter new name for '{old_key}':")
if new_key is not None:
children = self.tree.get_children(selected_item)
self.tree.item(selected_item, text=new_key)
for child in children:
self.tree.move(child, selected_item, "end")
def add_new_key(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("Warning", "Please select a parent key to add a new key.")
return
parent_key = self.tree.item(selected_item)["text"]
new_key = simpledialog.askstring("New Key", f"Enter a new key for '{parent_key}':")
if new_key is not None:
self.tree.insert(selected_item, "end", text=new_key)
if __name__ == "__main__":
root = tk.Tk()
app = NestedDictManager(root)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment