1

So I am creating a small data handler program that essentially allows the user to turn in a form that takes in values such as your address, city, name, email, etc. Pressing "View Personnel Data" opens up another Tkinter window which displays all the data that users have previously entered in (data which is stored in a text file and then read from to display the data). I have organized the data in columns in a secondary Tkinter window based on what the data is (e.g. address, city, etc). Of course, eventually, there won't be enough room in the windows to display all entries, and as such the user would want to be able to scroll through them. As a newbie to Tkinter and python in general, I am not sure as to how I would go about doing this. Below I have attached pictures of the windows that are displayed in my program and my code.

Form to submit info

Window which displays all entries (This is where I want to be able to scroll through the entries)

My code:

import tkinter as t

root = t.Tk()
root.title("Data Handler")
root.geometry('250x250')

#class viewPersons():
    #def open(self):

def addPerson():
    data = open('data.txt', 'a')
    name = name_var.get()
    email = email_var.get()
    age = age_var.get()
    state = state_var.get()
    city = city_var.get()
    address = address_var.get()
    print(name+','+email+','+age+','+state+','+city+','+address)
    data.write(name+','+email+','+age+','+state+','+city+','+address+'\n')
    data.close()

viewopen=False

def viewWindow():
    global viewopen
    def on_close():
        global viewopen
        viewopen = False
        view.destroy()

    def onFrameConfigure(primarycanvas):
        primarycanvas.configure(scrollregion=primarycanvas.bbox("all"))

    if viewopen is False:
        viewopen=True
        view = t.Tk()
        view.geometry('800x300')

        primarycanvas = t.Canvas(view, borderwidth=0, background='#ffffff')
        frame = t.Frame(primarycanvas, background='#ffffff')
        vsb = t.Scrollbar(view, orient='vertical', command=primarycanvas.yview)
        primarycanvas.configure(yscrollcommand=vsb.set)
        vsb.pack(side="right", fill="y")
        primarycanvas.pack(side="left", fill="both", expand=True)
        primarycanvas.create_window((4, 4), window=frame, anchor="nw")

        frame.bind("<Configure>", lambda event, primarycanvas=primarycanvas: onFrameConfigure(primarycanvas))

        t.Label(frame,text='N͟a͟m͟e͟',borderwidth=2,relief='groove',font=(20)).grid(row=0,column=0)
        t.Label(frame, text='E͟m͟a͟i͟l͟',borderwidth=2,relief='groove',font=(20)).grid(row=0, column=1)
        t.Label(frame, text='A͟g͟e͟',borderwidth=2,relief='groove',font=(20)).grid(row=0, column=2)
        t.Label(frame, text='S͟t͟a͟t͟e͟',borderwidth=2,relief='groove',font=(20)).grid(row=0, column=3)
        t.Label(frame, text='C͟i͟t͟y͟',borderwidth=2,relief='groove',font=(20)).grid(row=0, column=4)
        t.Label(frame, text='A͟d͟d͟r͟e͟s͟s͟',borderwidth=2,relief='groove',font=(20)).grid(row=0, column=5)
        class Person():
            def __init__(self, name, email, age, state, city, address, rowcounter):
                self.name = name
                self.email = email
                self.age = age
                self.state = state
                self.city = city
                self.address = address
                self.rowcounter = rowcounter

            def display(self):
                t.Label(frame, text=self.name,font=(20)).grid(row=self.rowcounter,column=0)
                t.Label(frame,text=self.email,font=(20)).grid(row=self.rowcounter,column=1)
                t.Label(frame, text=self.age,font=(20)).grid(row=self.rowcounter, column=2)
                t.Label(frame, text=self.state,font=(20)).grid(row=self.rowcounter, column=3)
                t.Label(frame, text=self.city,font=(20)).grid(row=self.rowcounter, column=4)
                t.Label(frame, text=self.address,font=(20)).grid(row=self.rowcounter, column=5)

        data = open('data.txt', 'r+')
        rowcounter=1
        info = data.readlines()
        persons = {}
        person_id = 0

        for x in info:
            split = x.strip().split(',')
            print(split)
            person_id += 1
            persons[person_id] = Person(split[0],split[1],split[2],split[3],split[4],split[5], rowcounter)
            persons[person_id].display()
            rowcounter += 1
        print(persons)
        data.close()
        view.protocol('WM_DELETE_WINDOW', on_close)
        view.mainloop()




name_var = t.StringVar()
email_var = t.StringVar()
age_var = t.StringVar()
state_var = t.StringVar()
city_var = t.StringVar()
address_var = t.StringVar()


t.Label(root, text='Name:').grid(row=0,padx=4)
name_ent = t.Entry(root, textvariable=name_var).grid(row=0,column=1,pady=4)

t.Label(root, text='Email:').grid(row=1,padx=4)
email_ent = t.Entry(root, textvariable=email_var).grid(row=1,column=1,pady=4)

t.Label(root, text='Age:').grid(row=2, padx=4)
age_ent = t.Entry(root, textvariable=age_var).grid(row=2,column=1,pady=4)

t.Label(root, text='State:').grid(row=3, padx=4)
state_ent = t.Entry(root, textvariable=state_var).grid(row=3,column=1,pady=4)

t.Label(root, text='City:').grid(row=4,padx=4)
city_ent = t.Entry(root, textvariable=city_var).grid(row=4,column=1,pady=4)

t.Label(root, text='Address:').grid(row=5,padx=4)
address_ent = t.Entry(root, textvariable=address_var).grid(row=5,column=1,pady=4)

t.Button(root, text='Submit',width=15,command=addPerson).grid(row=6,columnspan=2,ipadx=10)

t.Button(root,text='View Personnel Data',width=15,command=viewWindow).grid(row=7,columnspan=2,ipadx=10)


root.mainloop()
Isukali
  • 109
  • 12
  • Hope this helps u. https://stackoverflow.com/questions/36115062/tkinter-scroll-bar-not-scrolling Also https://stackoverflow.com/questions/3085696/adding-a-scrollbar-to-a-group-of-widgets-in-tkinter?noredirect=1&lq=1 – Gunesh Shanbhag May 19 '20 at 04:22
  • What?Do you want a scrollbar? – jizhihaoSAMA May 19 '20 at 09:46
  • Yup, I want a functioning scroll bar that lets me scroll through all the entries. – Isukali May 19 '20 at 14:17
  • Also, @GuneshShanbhag, I followed those threads and got pretty close to replicating the scroll bar and its scroll space however I don't see anything appearing on-screen on my personnel windows when I actually go running the program. I have assigned geometry to the widgets with .grid() but I'm not sure what's going on. I am not getting any error messages and I've updated the main post above to reflect my current code. – Isukali May 19 '20 at 15:24
  • Edit: I was able to fix the issue, turns out I had my borderwidth set to a ridiculously high number! – Isukali May 19 '20 at 15:33

0 Answers0