【问题标题】:Tkinter: Addressing Label widget created by for loopTkinter:由 for 循环创建的寻址标签小部件
【发布时间】:2013-04-04 01:44:30
【问题描述】:

以下是我的脚本。基本上,它会要求用户在输入框中输入一个数字。一旦用户输入一个数字并单击“确定”,它将为您提供标签+按钮的组合,具体取决于用户在输入框中输入的数字。

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(..))吗?

【问题讨论】:

    标签: python widget tkinter


    【解决方案1】:

    当然!只需制作一个标签列表,在每个标签上调用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 调用分隔到单独的行中,就像上面的代码一样。

    【讨论】:

    • 这是唯一的方法吗?因为如果用户输入 1000,标签列表的长度将为 1000,这几乎不可能像 myClick2 函数那样使用“if”函数。而且我不能使用 for 循环来更改每个标签需要的所有标签有不同的文字。不过非常感谢您的帮助。
    • 我只是将“if”作为示例,说明如何稍后在代码中设置标签配置值。您仍然可以使用 for 循环来更改标签,您只需将所有所需的标签保留在列表中并在循环中引用它们。另请注意,您可以检查以确保用户输入了一个合理的值,而不是 1000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多