在 for 循环中创建几个 tkinter 小部件并将它们分配给变量

Posted

技术标签:

【中文标题】在 for 循环中创建几个 tkinter 小部件并将它们分配给变量【英文标题】:Creating several tkinter widgets in a for loop and assigning them to variables 【发布时间】:2017-11-04 10:27:27 【问题描述】:

在一本关于 Python/tkinter 的食谱书中,我发现了这个关于如何在一个循环中创建三个 Radiobutton 小部件的 sn-p:

colors = ["Blue", "Gold", "Red"]
radVar = tk.IntVar()
radVar.set(99)                   

for col in range(3):                          
    curRad = 'rad' + str(col)
    curRad = tk.Radiobutton(win, text=colors[col],         variable=radVar,
         value=col,
         command=radCall)

    curRad.grid(column=col, row=5, sticky=tk.W)

我明白了使用循环的意义,但我希望变量curRad 被用作例如一个列表,最终包含对所有这些单选按钮的引用。这里发生了什么? Python 是否以某种方式在每次迭代中创建自定义命名的变量?对我来说,看起来我们正在将一个字符串分配给一个变量,然后将一个小部件的引用分配给同一个变量,并且在每次迭代时都做同样的事情。

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

我真的很喜欢你的解决方案,杰森。您可以稍后通过生成的列表的索引来引用按钮。

您也可以按如下方式创建按钮

for col in range(3):                          
    globals()["curRad" + str(col)] = tk.Radiobutton(win, text=colors[col], variable=radVar, value=col, command=radCall)

所以与每个按钮关联的变量的名称会有所不同,在这种情况下:

curRad0

curRad1

curRad2

【讨论】:

【参考方案2】:

curRad = 'rad' + str(col) 行完全没有任何作用,因为变量在下一行被重新分配。

该代码不会为您提供对单个单选按钮的任何持久引用 - 但您通常不需要一个:确定选择哪个单选按钮,或以编程方式选择一个单选按钮,是通过它们的变量 (radVar) 完成的全部分享。

如果您真的想保留对每个按钮的引用,您可以输入:

allRads = []

在循环之上,并且:

allRads.append(curRad)

在循环内部。

【讨论】:

以上是关于在 for 循环中创建几个 tkinter 小部件并将它们分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中使用 for 循环创建嵌套小部件

如何在不中断 tkinter 主循环的情况下运行一个函数,同时将该函数的信息发送到我的主循环中的小部件?

创建第二个 Toplevel 小部件时,线程 Tkinter 脚本崩溃

如何在粘性框架中居中 tkinter 小部件

如何将文件位置存储到条目窗口小部件中--Tkinter

Tkinter:如何将文本小部件中输入的文本保存到新窗口中?