Python Tkinter:寻址由for循环创建的标签小部件

问题描述:

以下是我的脚本。基本上,它会要求用户在输入框中输入一个数字。一旦用户输入一个数字并点击确定,它会给你组合标签+按钮取决于用户输入到输入框中的数字。Python Tkinter:寻址由for循环创建的标签小部件

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() 

通常情况下,当我创建一个标签控件,我会做这样的事情

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

所以,当我想以后改变我的标签的文本,我可以只是简单地做这

mylabel.config(text='new text') 

但是现在,因为我使用for循环来一次创建所有标签,无论如何要在创建标签后解决各个标签? 例如,用户在输入框中键入'5',程序将给我5个标签+5个按钮。无论如何,我可以改变各个标签的属性(即label.config(..))吗?

当然!只需制作一个标签列表,每个标签都要拨打place,然后您可以稍后参考它们并更改它们的值。像这样:

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() 

另请注意!在原始代码Mylabel=Label(myframe,text=" mytext "+str(i)).place(x=10,y=10+(30*i))中,该调用将Mylabel设置为None,因为place方法返回None。您想要将place调用分隔成一行,就像上面的代码一样。

+0

是唯一的方法吗?因为如果用户输入1000,那么标签列表将具有1000的长度,这几乎不可能像myClick2函数那样使用'if'函数。并且我不能使用for循环来更改所有标签,因为每个单独标签都需要有不同的文字。但非常感谢您的帮助。 – 2013-04-04 06:05:38

+0

我刚刚包含'if'作为如何在代码中设置标签配置值的示例。您仍然可以使用for循环更改标签,您只需将所有需要的标签保留在列表中并在循环中引用它们即可。另外请注意,您可以进行检查以确保用户输入了合理的值,而不是1000。 – twasbrillig 2013-04-04 06:24:20