我正在编写一个使用“网格几何管理”创建框架的程序。在该框架中,我创建一个带有循环的5行7列。在每一行中,我有5列条目和2列复选按钮。每个条目和复选框都分配给一个变量,并且使用网格几何管理中的(行,列)作为键将该变量存储在字典中。
widgets = {}
widgetsValue = {}
for i in range(rows): #Rows
for j in range(columns): #Columns
if j == 2 or j == 3: #column 2 and 3 is a checkbox
test = IntVar()
c = Checkbutton(inputFrame, bd=1, variable=test)
c.grid(row=2+i, column=j)
widgets[(i, j)] = c
widgetsValue[(i,j)] = test
else: # everything other than column 2 and 3 is a entry
test1 = StringVar()
e = Entry(inputFrame, text="", textvariable=test1)
e.grid(row=2+i, column=j)
widgets[(i, j)] = e
widgetsValue[(i,j)] = test1
现在,我无法创建一个按钮,一旦单击该按钮,它将以“行1:” entryvalue,entryvalue,checkvaluevalue,checkbuttonvalue,checkbuttonvalue,entryvalue,entryvalue”的形式用每行的值更新标签。 : “ 等等。
这是我的主意。
def submit():
global mystr
for i in range(rows): #Rows
mystr += "row[" + i + "]: "
for j in range(columns):
if (i,j) in widgets:
if widgets[(i,j)].winfo_class() == Entry:
if len(widgets[(i,j)].get()) != 0 :
mystr += widgets[(i,j)].get() + ", "
if widgets[(i,j)].winfo_class() == Checkbutton:
mystr += str(widgetsValue[(i,j)]) + ", "
myArr.append(mystr)
for x in myArr:
mystr += x
hiddenLabel['text'] = mystr # update hiddenlabel with mystr
enter code here
由于你IntVar
对每个值都使用一个值,因此只需要遍历每一行即可。对于任何行和列,你都可以使用widgetsValue[(i, j)]
。
例如,这是一种为第0行创建值列表的简单方法:
values = [
widgetsValue[(0,0)].get(),
widgetsValue[(0,1)].get(),
widgetsValue[(0,2)].get(),
widgetsValue[(0,3)].get(),
widgetsValue[(0,4)].get(),
widgetsValue[(0,5)].get(),
widgetsValue[(0,6)].get(),
]
Python具有称为列表理解的功能,可以很容易地将其压缩为一行:
values = [widgetsValue[(0,j)].get()) for j in range(columns)]
要将其转换为一个用逗号分隔的值的字符串,我们可以使用另一种列表理解将其转换为一个字符串列表,然后我们可以将这些值与逗号连接起来:
values = [str(value) for value in values]
values = ", ".join(values)
我们可以轻松地循环执行所有操作,以便可以分别获取每一行。请注意,代码使用的i
不是硬编码零,如前面的示例所示:
for i in range(rows):
values = [widgetsValue[(i,j)].get() for j in range(columns)]
values = [str(value) for value in values]
values = ", ".join(values)
你需要行号,因此我们可以将带格式的字符串文字(或fstring)与一条print
语句一起使用,以将值打印到终端:
print(f"row {i}: {values}")
将所有内容放在一起,并将前两个列表理解合并为一个,我们最终得到以下结果:
for i in range(rows):
values = [str(widgetsValue[(i,j)].get()) for j in range(columns)]
values = ", ".join(values)
print(f"row {i}: {values}")
这可行,但是我很好奇是否有可以使用widgets.get而不是widgetsvalue.get吗?
@dicktaylor:是的,您可以使用
widgets.get
。由于检查按钮没有get
方法,因此解决方案将更加复杂。或者,仅创建一个包含条目窗口小部件的列表,然后是IntVar
该复选框的。只要列表中的每个项目都有一个get
方法,此确切的解决方案将起作用。