我正在写一个程序,用网格几何管理创建一个框架。在这个框架中,我创建了5行7列,其中包含一个循环。在每一行中,我有5列入口和两列复选按钮。每个条目和复选框都指定给一个变量,该变量将使用栅格几何图形管理中的(行、列)作为键存储在字典中
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、checkbuttonvalue、checkbuttonvalue、checkbuttonvalue、entryvalue、entryvalue”、行2:“等等
这是我的想法
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行创建值列表的简单方法:
Python有一个名为list comprehension的东西,可以很容易地将它压缩成一行:
要将其转换为逗号分隔值的字符串,我们可以使用另一个列表理解将其转换为字符串列表,并从中使用逗号连接值:
我们可以很容易地在一个循环中完成这一切,这样我们就可以分别得到每一行。请注意,代码使用
i
而不是像前面的示例中那样使用硬编码的零:您需要行号,因此我们可以使用带有^{cd4>}语句的formatted string literal(或fstring)将值打印到终端:
将所有这些放在一起,并将前两个列表理解合并为一个,我们最终得出以下结论:
相关问题 更多 >
编程相关推荐