【问题标题】:Python Tkinter: How to config a button that was generated in a loop?Python Tkinter:如何配置在循环中生成的按钮?
【发布时间】:2017-06-16 11:28:28
【问题描述】:

我正在使用 Python 2.7 和 Tkinter 为我的代码制作 GUI。 在某一时刻,一个框架在一个循环中充满了许多按钮。当我点击其中一个按钮时,该函数需要知道它是从哪里调用的,所以我搜索了一下,发现了一个很好的方法:

def generate_buttons(n):
    for i in xrange(n):
        newbutton = str(i)
        newbutton = Button(myFrame, text=newbutton, command= lambda name=i:print_name(name)).grid(column=i)

和:

def print_name(name):
    print name

所以当我生成这样的按钮时:

generate_buttons(5)

5 个按钮排成一行。如果我点击数字 3,控制台会打印“3”。

如果我想进一步访问这些按钮,我该怎么办。例如给他们一个新的外观。如果我只创建一个按钮,那就很容易了:

myButton.Button(text="bla")
myButton.config(relief=SUNKEN)

myButton.config(padx=10)

但在循环中,我一直覆盖“newbutton”。这是否意味着我无法再访问个人?如何“寻址”一个迭代创建且因此没有名称的对象?

【问题讨论】:

  • 用它们填充listdict 对象。
  • 你可以看到一个类似的问题,昨天问的,here
  • 我对dicts不太熟悉,所以我试着用一个列表来做。在我声明的函数中: global newbutton;在函数之外,我使用以下方法初始化列表: newbutton = [None] * 5;然后通过调用函数来填充它: generate_buttons(5);当我这样做时: newbutton[2].config(...) 它说“AttributeError:'NoneType'对象没有属性'config'”

标签: python-2.7 tkinter


【解决方案1】:

使用结构(listdictionary)来保存您的对象。 这两个选项之间的主要区别 - 使用list,访问这些对象的逻辑仅限于索引,而使用dictionarykey 参数可以是任何东西(也可以是索引)。如果您需要阅读有关结构的内容 - 请查看 python docs

有一个带有列表的sn-p:

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk


def generate_buttons(n):
    for _ in range(n):              #   xrange in python 2
        newbutton = tk.Button(text=_, command=lambda name=_: change_relief(name))
        newbutton.grid(column=_)
        buttons.append(newbutton)


def change_relief(idx):
    button = buttons[idx]

    if button['relief'] == 'raised':
        button.config(relief='sunken')
    else:
        button.config(relief='raised')


root = tk.Tk()

#   our list with buttons
buttons = []

#   generate some buttons
generate_buttons(5)

#   another button, that uses a value from an entry below
change_relief_button = tk.Button(text='Change relief by id',
                                 command=lambda: change_relief(int(id_entry.get())))
change_relief_button.grid()

#   entry with user input
id_entry = tk.Entry()
id_entry.grid()

#   default 0
id_entry.insert(0, '0')

#   mainloop
root.mainloop()

每个带编号的按钮都可以更改自己的浮雕,而 `change_relief_button' 通过条目中的索引更改按钮的浮雕。

【讨论】:

  • 感谢您的出色帮助!起初我认为您的方法仅限于更改浮雕,因为在创建按钮时立即调用了 change_relief() 命令,但我对您的解决方案进行了一些试验,并找到了将其用于我自己目的的好方法。我认为有用的技巧是在外部创建按钮列表,但在函数内附加项目。
  • @offeltoffel,是的,没错!我坚持relief 选项只是因为你的问题中提到了它。忘了提到你可以以任何你想要的方式与button 交互(显然),因此这个 sn-p 只是一个例子。很高兴,如果它真的对你有帮助。
猜你喜欢
  • 2022-08-19
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多