【问题标题】:Python Tkinter For Loop Widget addressingPython Tkinter For Loop 小部件寻址
【发布时间】:2018-03-26 01:40:02
【问题描述】:

我正在练习使用 for 循环在 Python 中创建 Tkinter 小部件。但是如果在某些情况下我需要处理在 for 循环下创建的小部件,我该怎么做呢?

另外,我对下面的 for 循环的实际工作方式感到困惑,因为看起来只有一个单选按钮对象是由三个具有不同属性的副本创建的。谁能解释一下我们如何使用相同的对象名称创建三个实例背后的逻辑?

import tkinter as tk

#Window definition    
win = tk.Tk()
win.geometry("500x500")

#Radio Button Globals
colors = ["Blue", "Gold", "Red"]

#Radio Button click action
def radCall():
    radSEL = radVar.get()
    if radSEL == 0:
        win.configure(background=COLOR1)
    elif radSEL == 1:
        win.configure(background=COLOR2)
    elif radSEL == 2:
        win.configure(background=COLOR3)   

#Radio Button    
radVar = tk.IntVar() #Radio Button Variable
radVar.set(99) #Select non existened value

for col in range(3):
       rad = tk.Radiobutton(win, text=colors[col], variable=radVar, value=col, command=radCall)
       rad.grid(column=col, row=5, sticky=tk.W)

win.mainloop()

【问题讨论】:

  • 你做过研究吗?这个网站上有很多关于在循环中创建小部件的问题。

标签: python loops for-loop tkinter widget


【解决方案1】:

每次循环都会重新分配 rad 变量,但是,tkinter 每次循环都会创建一个新的单选按钮。它们都使用相同的变量radVar,这使得它们隐式相关。它们都有不同的value 属性,因此这使得它们可以配置为作为单选按钮组很好地工作。

要回答创建后如何与按钮交互的问题,通常建议创建一个字典来保存小部件。例如,可以将循环重新构造如下,以便以后访问单选按钮。

radio = {}
for col in colors:
    radio[col] = tk.Radiobutton(win, text=colors[col], variable=radVar, value=col, command=radCall)
    radio[col].grid(column=col, row=5, sticky=tk.W)

# Then later you can reconfigure a radiobutton text or something
radio['Red'].configure(text='New text on radio button')

【讨论】:

  • 它是字典而不是列表有什么原因吗?我用列表尝试了代码,但是当我这样做时,它说索引超出了范围。请给我一个列表的例子吗?
  • 使用字典的原因是为了让代码更具可读性。只要您知道第三个按钮是“红色”,您就可以使用列表。然后您将按钮称为收音机 [2]。我修改了示例,使字典优势更加明显。
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
相关资源
最近更新 更多