【问题标题】:Problem with getting Entry and checkbutton values Tkinter获取条目和检查按钮值 Tkinter 的问题
【发布时间】:2020-11-27 22:35:47
【问题描述】:

我正在编写一个使用网格几何管理创建框架的程序。在那个框架中,我用一个循环创建了 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、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

【问题讨论】:

  • 我不清楚你的问题是什么。另外,看看你的想法,为什么你必须检查小部件是否是Entry?为什么你不能直接得到StringVar.get/IntVar.get

标签: python tkinter


【解决方案1】:

由于您对每个值都使用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 有一个叫做list comprehension 的东西,它可以很容易地把它压缩成一行:

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)

你想要行号,所以我们可以使用 formatted string literal(或 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 方法,这个确切的解决方案就可以工作。
猜你喜欢
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2013-01-02
  • 2023-03-18
相关资源
最近更新 更多