Created
November 30, 2023 04:15
-
-
Save hdary85/a5b56875ae7233912a59a6eeca89b270 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import tkinter as tk | |
from tkinter import simpledialog, messagebox | |
class NestedDictManager: | |
def __init__(self, root, data): | |
self.root = root | |
self.root.title("Nested Dictionary Manager") | |
self.data = data # Use the provided dictionary | |
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,)) | |
self.update_dict_value(key, new_value) | |
def update_dict_value(self, key, new_value, dictionary=None): | |
if dictionary is None: | |
dictionary = self.data | |
for k, v in dictionary.items(): | |
if k == key: | |
dictionary[k] = new_value | |
return | |
elif isinstance(v, dict): | |
self.update_dict_value(key, new_value, v) | |
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: | |
key = self.tree.item(selected_item)["text"] | |
self.tree.delete(selected_item) | |
self.delete_dict_key(key) | |
def delete_dict_key(self, key, dictionary=None): | |
if dictionary is None: | |
dictionary = self.data | |
for k, v in dictionary.items(): | |
if k == key: | |
del dictionary[k] | |
return | |
elif isinstance(v, dict): | |
self.delete_dict_key(key, v) | |
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: | |
self.tree.item(selected_item, text=new_key) | |
self.rename_dict_key(old_key, new_key) | |
def rename_dict_key(self, old_key, new_key, dictionary=None): | |
if dictionary is None: | |
dictionary = self.data | |
for k, v in dictionary.items(): | |
if k == old_key: | |
dictionary[new_key] = dictionary.pop(old_key) | |
return | |
elif isinstance(v, dict): | |
self.rename_dict_key(old_key, new_key, v) | |
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) | |
self.add_dict_key(parent_key, new_key) | |
def add_dict_key(self, parent_key, new_key, dictionary=None): | |
if dictionary is None: | |
dictionary = self.data | |
for k, v in dictionary.items(): | |
if k == parent_key: | |
dictionary[k][new_key] = "New Value" # You may modify this line to set a default value | |
return | |
elif isinstance(v, dict): | |
self.add_dict_key(parent_key, new_key, v) | |
if __name__ == "__main__": | |
data = { | |
'key1': 'value1', | |
'key2': { | |
'key3': 'value3', | |
'key4': 'value4' | |
}, | |
'key5': { | |
'key6': { | |
'key7': 'value7' | |
} | |
} | |
} | |
root = tk.Tk() | |
app = NestedDictManager(root, data) | |
root.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment