Syrius
Syrius

Reputation: 25

How get value from Tkinter Var in class?

I'm trying to put old school sequential Tkinter code into class structure code.

So let's consider this example :

import Tkinter as Tk

def StartProcess():
    print Text_1_Var.get(), Text_2_Var.get(), Text_3_Var.get()

if __name__ == '__main__':
    MainFrame = Tk.Tk()

    Tk.Button(MainFrame , text = "Start",command=StartProcess).grid(column=2, row=0)
    Tk.Label(MainFrame , text = "1").grid(column=1, row=1)
    Text_1_Var = Tk.StringVar()
    Text_1 = Tk.Entry(MainFrame ,  width=40, textvariable = Text_1_Var).grid(column=2, row=1)
    Tk.Label(MainFrame , text = "2").grid(column=1, row=2)
    Text_2_Var = Tk.StringVar()
    Text_2 = Tk.Entry(MainFrame ,  width=40, textvariable = Text_2_Var).grid(column=2, row=2)
    Tk.Label(MainFrame , text = "3").grid(column=1, row=3)
    Text_3_Var = Tk.StringVar()
    Text_3 = Tk.Entry(MainFrame ,  width=40, textvariable = Text_3_Var).grid(column=2, row=3)
    # etc

    MainFrame.mainloop()

On press "Start" it displays values of Entry from 1 to 3.

Now i recode it as follow :

import Tkinter as Tk

def StartProcess():
    print "???"

class NewEntry(Tk.Frame):
    def __init__(self,master=None,idnumber=None):
        Tk.Frame.__init__(self,master)
        self.pack(side=Tk.TOP)
        self.CreateWidgets(idnumber)
    def CreateWidgets(self,idnumber):
        Tk.Label(master=self, text = idnumber).grid(column=1, row=0)
        self.Text_Var = Tk.StringVar()        
        self.Text = Tk.Entry(master=self,  width=40, textvariable = self.Text_Var).grid(column=2, row=0)

if __name__ == '__main__':
    MainFrame = Tk.Tk()

    Tk.Button(master=MainFrame,text="Start", command=StartProcess).pack()
    for i in range (1, 4): # or more
        NewEntry(master=MainFrame,idnumber=str(i))

    MainFrame.mainloop()

GUI are both identical. I want to get the same result but i don't know where my function StartProcess should take place and how extract value of each self.Text_Var instance.

Upvotes: 0

Views: 142

Answers (1)

chepner
chepner

Reputation: 530862

It's not enough to create a NewEntry object; you need to save references to them so you can access them later (e.g., from StartProcess).

entries = []
for i in range (1, 4): # or more
    e = NewEntry(master=MainFrame,idnumber=str(i))
    entries.append(e)
# Or more simply,
# entries = [NewEntry(master=MainFrame, idnumber=str(i)) for i in range(1,4)]

Then, StartProcess becomes something like

def StartProcess():
    strings = [x.Text_Var.get() for x in entries]
    print " ".join(strings)

Upvotes: 1

Related Questions