4

The following is my script. Basically, it will ask the user to input a number into the Entry box. Once the user enter a number and click OK, it will give you combination of Labels+Buttons depends on the number that user typed in to the Entry box.

from Tkinter import *

root=Tk()

sizex = 600
sizey = 400
posx  = 0
posy  = 0
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

def myClick():
    myframe=Frame(root,width=400,height=300,bd=2,relief=GROOVE)
    myframe.place(x=10,y=10)
    x=myvalue.get()
    value=int(x)
    for i in range(value):
        Mylabel=Label(myframe,text=" mytext "+str(i)).place(x=10,y=10+(30*i))
        Button(myframe,text="Accept").place(x=70,y=10+(30*i))

mybutton=Button(root,text="OK",command=myClick)
mybutton.place(x=420,y=10)

myvalue=Entry(root)
myvalue.place(x=450,y=10)

root.mainloop()

Normally, when i create a label widget, i would do something like this

mylabel=Label(root,text='mylabel')
mylabel.pack()

So when i want to change the text of my label later on i can just simply do this

mylabel.config(text='new text')

But now, since i am using for loop to create all labels at once, is there anyway to address the individual labels after the labels has been created? For example, the user typed in '5' into the entry box and the program will give me 5 lables + 5 buttons. Is there anyway for me to change the properties (ie, label.config(..)) of the individual labels?

martineau
  • 119,623
  • 25
  • 170
  • 301
Chris Aung
  • 9,152
  • 33
  • 82
  • 127

1 Answers1

4

Sure! Just make a list of labels, call place on each one, and then you can reference them later and change their values. Like so:

from Tkinter import *

root=Tk()

sizex = 600
sizey = 400
posx  = 0
posy  = 0
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))

labels = []

def myClick():
    del labels[:] # remove any previous labels from if the callback was called before
    myframe=Frame(root,width=400,height=300,bd=2,relief=GROOVE)
    myframe.place(x=10,y=10)
    x=myvalue.get()
    value=int(x)
    for i in range(value):
        labels.append(Label(myframe,text=" mytext "+str(i)))
        labels[i].place(x=10,y=10+(30*i))
        Button(myframe,text="Accept").place(x=70,y=10+(30*i))

def myClick2():
    if len(labels) > 0:
        labels[0].config(text="Click2!")
    if len(labels) > 1:
        labels[1].config(text="Click2!!")

mybutton=Button(root,text="OK",command=myClick)
mybutton.place(x=420,y=10)

mybutton2=Button(root,text="Change",command=myClick2)
mybutton2.place(x=420,y=80)

myvalue=Entry(root)
myvalue.place(x=450,y=10)

root.mainloop()

Also note! In the assignment Mylabel=Label(myframe,text=" mytext "+str(i)).place(x=10,y=10+(30*i)) in the original code, that call sets Mylabel to None, since the place method returns None. You want to separate the place call into its own line, like in the code above.

twasbrillig
  • 17,084
  • 9
  • 43
  • 67
  • is it the only way? because if the user enter 1000, the label list will have length of 1000 which is almost impossible to use 'if' function like the one on myClick2 function.And i can't use for loop to change all the labels as each individual label need to have different text. But thanks a lot for your help. – Chris Aung Apr 04 '13 at 06:05
  • I just included the 'if' as an example of how you can set label config values later on in your code. You can still use a for loop to change the labels, you'd just need to keep all the desired labels in a list and reference them in your loop. Also note that you can put in a check to make sure the user entered a reasonable value, not 1000. – twasbrillig Apr 04 '13 at 06:24