在Tkinter Entry Widgets的循环中创建StringVar变量

时间:2015-09-17 21:25:32

标签: python python-2.7 tkinter

我有一个小脚本,可以生成随机数量的条目小部件。每个人都需要一个StringVar(),所以我可以为小部件分配文本。如何创建这些作为循环的一部分,因为我不会提前知道将有多少?

from Tkinter import *
import random
root = Tk()
a = StringVar()
height = random.randrange(0,5)
width = 1

for i in range(height): #Rows
    value + i = StringVar()
    for j in range(width): #Columns
        b = Entry(root, text="", width=100, textvariable=value+i)
        b.grid(row=i, column=j)

mainloop()

2 个答案:

答案 0 :(得分:5)

您问题的直接答案是使用列表或字典来存储StringVar的每个实例。

例如:

vars = []
for i in range(height):
    var = StringVar()
    vars.append(var)
    b = Entry(..., textvariable=var)

但是,您不需要将StringVar与条目小部件一起使用。如果您希望两个小部件共享相同的变量,或者如果您在变量上执行跟踪,那么StringVar会很好,但是否则会增加开销而没有任何实际好处。

entries = []
for i in range(height):
    entry = Entry(root, width=100)
    entries.append(entry)

您可以使用方法insertdelete插入或删除数据,并使用get获取值:

for i in range(height):
    value = entries[i].get()
    print "value of entry %s is %s" % (i, value)

答案 1 :(得分:3)

只需将它们存储在list

vars = []
for i in range(height): #Rows
    for j in range(width): #Columns
        vars.append(StringVar())
        b = Entry(root, text="", width=100, textvariable=vars[-1])
        b.grid(row=i, column=j)

也就是说,您应该将Entry小部件本身存储在list或2D list中,如下所示:

entries = []
for i in range(height): #Rows
    entries.append([])
    for j in range(width): #Columns
        entries[i].append(Entry(root, text="", width=100))
        entries[i][j].grid(row=i, column=j)

然后,您可以使用insert()方法为每个小部件指定文本:

entries[0][3].insert(0, 'hello')