enter image description hereI try to create a menu like this in tkinter. Here is what I would like on this picture. In this Menu, I have categories (here on the picture for example General Options, Body Options, Neck Options...). When I click on a categories, a sub-list of others options appear (for example for the Neck Options, we can see Neck Wood, Number of frets, Neck Profile etc.). And if I click on one option, I want to selection one option (it could be a drop-down list or a toggle switch or checkbox, whatever allowing to choose something). For example here, in the option Fingerboard Radius, I can choose 14, 12, 10, 12-16.
I tried to embed toggle-switch and drop-down list in a treeview but it doesn't seem it is possible... I tried using tab but no, it is not what I want. Here is an example using drop-down-list :
import tkinter as tk
class GuitareDesignerApp:
def __init__(self, root):
self.root = root
self.root.title("Guitare Designer")
# Frame à gauche
self.left_frame = tk.Frame(self.root, width=200, bg="gray")
self.left_frame.pack(side="left", fill="both", expand=False)
# Frame central
self.center_frame = tk.Frame(self.root, bg="white")
self.center_frame.pack(side="left", fill="both", expand=True)
# Frame à droite
self.right_frame = tk.Frame(self.root, width=200, bg="gray")
self.right_frame.pack(side="left", fill="both", expand=False)
# Catégories avec options
self.categories = {
"Options générales": ["Dextérité", "Marque"],
"Body": ["Type de bois", "Forme"],
"Neck": ["Type de bois", "Type de manche"],
"Head": ["Type de tête", "Logo"],
"Electronics": ["Micros", "Système électronique"],
"Hardware": ["Chevalet", "Mécaniques"],
"Export/Load": ["Exporter", "Charger"]
}
# Label pour les catégories
self.category_labels = []
for category in self.categories:
label = tk.Label(self.left_frame, text=category, bg="gray", fg="white")
label.pack(fill="x", pady=5)
self.category_labels.append(label)
# Menu déroulant pour les options
self.option_menus = {}
for category, options in self.categories.items():
option_var = tk.StringVar(self.left_frame)
option_var.set(options[0]) # Initialisation avec la première option
menu = tk.OptionMenu(self.left_frame, option_var, *options)
menu.pack(fill="x", padx=10)
self.option_menus[category] = option_var
if __name__ == "__main__":
root = tk.Tk()
app = GuitareDesignerApp(root)
root.mainloop()
and here another on with treeview :
import tkinter as tk
from tkinter import ttk
class App:
def __init__(self, root):
self.root = root
self.root.title("Application")
# Création de l'arbre
self.tree = ttk.Treeview(root)
self.tree.pack(side="left", fill="both", expand=True)
self.tree.bind("<<TreeviewSelect>>", self.on_select)
# Ajout des éléments à l'arbre
general_node = self.tree.insert("", "end", text="général")
body_node = self.tree.insert("", "end", text="body")
self.tree.insert(general_node, "end", text="dextérité")
self.tree.insert(general_node, "end", text="marque")
self.tree.insert(body_node, "end", text="bois")
self.tree.insert(body_node, "end", text="couleur")
# Panneau droit
self.right_frame = tk.Frame(root, bg="lightgrey", width=200)
self.right_frame.pack(side="right", fill="both", expand=True)
self.color_label = ttk.Label(self.right_frame, text="Couleur:")
self.color_label.grid(row=2, column=0, sticky=tk.W)
self.color_combo = ttk.Combobox(self.right_frame, values=["Noir", "Blanc", "Sunburst"])
self.color_combo.grid(row=2, column=1)
def on_select(self, event):
selected_item = self.tree.selection()[0]
selected_text = self.tree.item(selected_item, "text")
if selected_text == "couleur":
self.color_label.grid(row=2, column=0, sticky=tk.W)
self.color_combo.grid(row=2, column=1)
else:
self.color_label.grid_forget()
self.color_combo.grid_forget()
def main():
root = tk.Tk()
app = App(root)
root.mainloop()
if __name__ == "__main__":
main()