Ok,
Hope you don't mind, but I kind of got carried away with this.
All seems to work, except for some reason the entry portion is sitting in the
middle of the right frame, rather than at top.
I also didn't clear entry out after a new person was entered.
I'll leave that for you to finish.
Here's what I did:
Sorry this is more than you asked for, I was on a roll.
Hope you don't mind, but I kind of got carried away with this.
All seems to work, except for some reason the entry portion is sitting in the
middle of the right frame, rather than at top.
I also didn't clear entry out after a new person was entered.
I'll leave that for you to finish.
Here's what I did:
import tkinter as tk import os import json import tkinter.ttk as ttk class ShoeBot: def __init__(self, parent, filename): self.roots = parent self.roots.title('AWD ShoeBot') # self.roots.geometry('400x200+10+10') self.treeheight = 19 self.filename = os.path.abspath(filename) self.fp = None self.people = {} self.person_added = False self.this_person = None self.name = tk.StringVar() self.shoe_size = tk.StringVar() self.build_gui() self.load_tree() def build_gui(self): self.create_main_frame() self.create_left_frame() self.create_right_frame() self.create_bottom_frame() self.create_tree() self.create_user_dialog() self.create_statusbar() self.roots.protocol("WM_DELETE_WINDOW", self.on_delete) def create_main_frame(self): self.main_frame = tk.Frame(self.roots, relief=tk.RAISED) self.main_frame.grid(row=0, column=0, sticky='nseww') self.main_frame.columnconfigure(0, weight=1) self.main_frame.rowconfigure(0, weight=1) self.main_frame.pack(pady=5, padx=5) def create_left_frame(self): self.left_frame = tk.Frame(self.main_frame, relief=tk.SUNKEN) self.left_frame.grid(row=0, rowspan=self.treeheight, column=0, columnspan=2, sticky='ns') def create_right_frame(self): self.right_frame = tk.Frame(self.main_frame, relief=tk.SUNKEN) self.right_frame.grid(row=0, rowspan=self.treeheight, column=2, columnspan=10, sticky='e') def create_bottom_frame(self): self.bottom_frame = tk.Frame(self.main_frame, relief=tk.SUNKEN) self.bottom_frame.grid(row=self.treeheight + 1, column=0, columnspan=11, sticky='ew') def create_tree(self): treestyle = ttk.Style() treestyle.configure('Treeview.Heading', foreground='white', borderwidth=2, background='SteelBlue', rowheight=self.treeheight, height=3) self.tree = ttk.Treeview(self.left_frame, height=self.treeheight, padding=(2, 2, 2, 2), columns='Name', selectmode="extended") self.tree.column('#0', stretch=tk.YES, width=180) self.tree.tag_configure('monospace', font='courier') treescrolly = tk.Scrollbar(self.left_frame, orient=tk.VERTICAL, command=self.tree.yview) treescrolly.grid(row=0, rowspan=self.treeheight, column=1, sticky='ns') treescrollx = tk.Scrollbar(self.left_frame, orient=tk.HORIZONTAL, command=self.tree.xview) treescrollx.grid(row=self.treeheight + 1, column=0, columnspan=2, sticky='ew') self.tree.configure(yscroll=treescrolly) self.tree.configure(xscroll=treescrollx) self.tree.grid(row=0, rowspan=self.treeheight, column=0, sticky='nsew') self.tree.bind('<Double-1>', self.name_selected) def load_tree(self): if os.path.isfile(self.filename): self.load_data() for person, value in self.people.items(): self.tree.insert('', 'end', text='{}'.format(person)) # print('person: {}, value: {}'.format(person, value)) def create_user_dialog(self): self.intruction = tk.Label(self.right_frame, text='Enter Information Below\n') self.intruction.grid(row=0, column=0, sticky='nse') self.nameL = tk.Label(self.right_frame, text='Name: ') self.shoeSizeL = tk.Label(self.right_frame, text='Shoe Size: ') self.nameL.grid(row=1, column=0, sticky='w') self.shoeSizeL.grid(row=2, column=0, sticky='w') self.nameE = tk.Entry(self.right_frame, textvariable=self.name) self.shoeSizeE = tk.Entry(self.right_frame, textvariable=self.shoe_size) self.nameE.grid(row=1, column=1) self.shoeSizeE.grid(row=2, column=1) signupButton = tk.Button(self.right_frame, text='Create', command=self.add_person) signupButton.grid(row=4, column=0, columnspan=2, sticky='w') def create_statusbar(self): self.sb = tk.Frame(self.bottom_frame) self.sb.grid(row=0, column=0, sticky='nsew') def on_delete(self): if self.person_added: self.save_data() self.roots.destroy() def load_data(self): with open(self.filename) as fp: self.people = json.load(fp) def save_data(self): with open(self.filename, 'w') as fo: json.dump(self.people, fo) def add_person(self): name = self.name.get() shoesize = self.shoe_size.get() self.people[name] = {'shoesize': shoesize} self.tree.insert('', 'end', text='{}'.format(name)) self.person_added = True def name_selected(self, event): curitem = self.tree.focus() nidx = self.tree.item(curitem) name = nidx['text'] shoesize = self.people[name]['shoesize'] print('You selected {} who wears size {} shoe'.format(name, shoesize)) # do stuff with selected person def find_person(self): try: person = self.name.get() self.this_person = self.people[person] print('found {} shoesize: {}'.format(self.this_person[name], self.this_person[name]['shoesize'])) except: 'Adding {} shoesize: {}'.format(self.name.get(), self.shoe_size.get()) self.add_person() self.this_person = self.people[person] self.name.set('') self.shoe_size.set('') return self.this_person def main(): root = tk.Tk() sb = ShoeBot(root, filename='PeopleFile.json') root.mainloop() if __name__ == '__main__': main()Screenshot:
Sorry this is more than you asked for, I was on a roll.