当前位置: 首页 > 面试题库 >

Tkinter:for循环创建的Addressing Label小部件

罗允晨
2023-03-14
问题内容

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

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调用分成单独的一行,就像上面的代码一样。



 类似资料:
  • 问题内容: 为什么在Java中引入此循环?它是Java创建的吗?它的目的是什么(提高内存/ cpu的使用效率)? 问题答案: 为什么在Java中引入此循环? 只是为了简化遍历通用集合和数组。代替 你可以做 这使得代码更具可读性和更好的可维护性。 它是Java创作吗? 不,它早于Java就以其他语言存在。Java实施起来相对较晚。 目的是什么? 请参阅第一个答案。 要了解更多信息,请查阅有关该主题的

  • 问题内容: 我正在尝试在循环内创建函数: 问题在于所有功能最终都相同。这三个函数都没有返回0、1和2,而是返回2: 为什么会发生这种情况,我应该怎么做才能获得分别输出0、1和2的3个不同函数? 问题答案: 你在后期绑定方面遇到了问题-每个函数都i尽可能晚地查找(因此,在循环结束后调用时,i将设置为2)。 可以通过强制早期绑定轻松修复:更改为以下形式: 缺省值(右手i输入i=i是参数名的默认值,i左

  • 问题内容: 如何从while循环中创建sql server cte 这样的循环 问题答案: 如果需要表: 如果您需要一个字符串:

  • 我有以下代码: 这里的主要循环是: 但是我不确定这是最好的方法(如果我想输入什么,这是行不通的) 然后我试了这个: 但正如我所意识到的,这并不像我预期的那么快。所以问题是:创建主循环的最佳方法是什么?

  • 问题内容: 我正在编写一个应用程序,以便在对等网络中进行一些分布式计算。在定义网络时,我有两个类P2PNetwork和P2PClient。我希望这些是通用的,因此具有以下定义: 与P2PClient一起定义setNetwork(T network)的方法。我希望用这段代码描述的是: P2PNetwork由某种类型的客户端组成 P2PClient只能属于其客户端与该客户端具有相同类型的网络(循环引用

  • 问题内容: 我试图在迭代对象列表的循环内创建: 现在,如果我遍历lambda列表并这样称呼它们: 我得到相同的价值。这是最后的价值obj在,因为那是在列表迭代器的块中的最后一个变量。有什么想法可以很好地重写代码以使其正常工作吗? 问题答案: 使用此行: