【问题标题】:Tkinter name widgets in a loop循环中的 Tkinter 名称小部件
【发布时间】:2017-05-03 11:47:20
【问题描述】:

我目前正在 Tkinter 中创建一个文本框“网格”,以模拟高尔夫记分卡系统。我目前正在使用下面的代码来创建这个网格。当我将这些文本框中的条目存储到 Microsoft Access 数据库中时,如果创建的小部件没有唯一名称,我如何使用 .get() 函数从各个文本框中检索值。我真的不想手动创建 105 个文本框,尽管我知道这会起作用。任何帮助表示赞赏。

        for x in range(1, 22):
            for y in range(4, 9):
                e  = tk.Text(self,
                             height=1,
                             width=3)

                e.grid(column=x,
                       row=y)

【问题讨论】:

    标签: python sql tkinter


    【解决方案1】:

    在这种情况下,我会使用字典,因为它允许您根据网格位置引用小部件。你可以这样做:

    text_widgets = {}
    for x in range(1, 22):
        for y in range(4, 9):
            e  = tk.Text(self,
                         height=1,
                         width=3)
    
            e.grid(column=x,
                   row=y)
    
            text_widgets[(x, y)] = e
    

    这允许您在以后按位置访问小部件 - 因此,如果您想要第 10 列第 7 行中的小部件的值,您可以使用以下方法访问它:

    text_widgets[(10, 7)].get('1.0', 'end-1c') 
    

    【讨论】:

      【解决方案2】:

      您可以使用列表来保存条目值并在循环后读取它们。这是我通常做的。

      试试:

      entries_list = []
      for x in range(1, 22):
                  for y in range(4, 9):
                      e  = tk.Text(self,
                                   height=1,
                                   width=3)
      
                      e.grid(column=x,
                             row=y)
                      entries_list.append(e)
      

      之后:

      for x in entries_list:
          x.get(1.0, END)
      

      【讨论】:

      • 从技术上讲,文本小部件索引不是浮点数。它们是"<line>.<character>" 形式的字符串。 1.0 是无害的,但你会得到与 1.10 不同的结果。