User0
User0

Reputation: 2951

Set Tkinter label texts as elements of list

I am building a gui that takes a query from a user and runs leFunction.aFunction(query) to return a list called Result. When the user presses enter, I want the text on each label to be set to an element of Result. My attempt, shown below, only prints out the last element of Result on the last label...(bear with me, I am a beginner with Tkinter.)

Thank you.

import Tkinter
import os
import leFunction

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

     def initialize(self):
        self.grid()

        self.entryVariable = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)
        self.entry.grid(column=0,row=0,sticky='EW')
        self.entry.bind("<Return>", self.OnPressEnter)
        self.entryVariable.set(u"")

        for j in range (1,10):
            self.labelVariable = Tkinter.StringVar()
            label = Tkinter.Label(self,textvariable=self.labelVariable,
                              anchor="w",fg="black",bg="white")

            label.bind("<1>", lambda event, text="text": \
                          self.click_link(event, text))

            label.grid(column=0,row=j,columnspan=2,sticky='EW')


            self.labelVariable.set(j)

        self.grid_columnconfigure(0,weight=1)
        self.resizable(True,False)
        self.update()
        self.geometry(self.geometry())       
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def OnPressEnter(self,event):
        #Result is a list
        Result = leFunction.aFunction(self.entryVariable.get())

        for i in range (0,len(Result)):
            print "result",i,":",Result[i]
            self.labelVariable.set(Result[i])
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def click_link(self, event, text):
        print "you clicked '%s'" % text
        #os.system("open "+file)

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()

Upvotes: 0

Views: 1998

Answers (1)

jedwards
jedwards

Reputation: 30260

The following code works (provided your aFunction code works as expected):

import Tkinter
import os
import leFunction

class simpleapp_tk(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()

        self.entryVariable = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,textvariable=self.entryVariable)
        self.entry.grid(column=0,row=0,sticky='EW')
        self.entry.bind("<Return>", self.OnPressEnter)
        self.entryVariable.set(u"")

        self.labelVars = []
        for j in range (1,10):
            labelVar = Tkinter.StringVar()
            labelVar.set(j)
            self.labelVars.append(labelVar)
            label = Tkinter.Label(self,textvariable=labelVar,
                              anchor="w",fg="black",bg="white")

            label.bind("<1>", lambda event, text="sup": \
                          self.click_link(event, text))

            label.grid(column=0,row=j,columnspan=2,sticky='EW')

        self.grid_columnconfigure(0,weight=1)
        self.resizable(True,False)
        self.update()
        self.geometry(self.geometry())
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def OnPressEnter(self,event):
        #Result is a list
        Result = leFunction.aFunction(self.entryVariable.get())

        for i in range (0,len(Result)):
            print "result",i,":",Result[i]
            self.labelVars[i].set(Result[i])
        self.entry.focus_set()
        self.entry.selection_range(0, Tkinter.END)

    def click_link(self, event, text):
        print "you clicked '%s'" % text
        #os.system("open "+file)

if __name__ == "__main__":
    app = simpleapp_tk(None)
    app.title('my application')
    app.mainloop()

Instead of setting a self.labelVariable over and over, you now create a self.labelVars list, each element corresponding to a labelVar. You can then set the text of the elements of this list as I do with:

self.labelVars[i].set(Result[i])

Upvotes: 1

Related Questions