Python 2.7 Python Tkinter:如何配置在循环中生成的按钮?

Python 2.7 Python Tkinter:如何配置在循环中生成的按钮?,python-2.7,tkinter,Python 2.7,Tkinter,我正在使用Python2.7和Tkinter为我的代码制作GUI。 在某一点上,一个框架中充满了循环中的许多按钮。当我单击其中一个按钮时,该函数需要知道从何处调用,因此我在谷歌上搜索并找到了一种很好的方法: def generate_buttons(n): for i in xrange(n): newbutton = str(i) newbutton = Button(myFrame, text=newbutton, command= lambda na

我正在使用Python2.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)
以及:

因此,当我生成如下按钮时:

generate_buttons(5)
这5个按钮显示在一行中。如果我点击数字3,控制台会显示“3”

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

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

但在循环中,我总是覆盖“newbutton”。这是否意味着我不能再接触这些人了?如何“寻址”一个迭代创建的对象,因此没有名称?

使用一个结构(一个
列表或一个
字典)来保存对象。
这两个选项之间的主要区别是:使用
列表
,访问这些对象的逻辑仅限于索引,而使用
字典
时,
参数可以是任何内容(也可以是索引)。如果你需要阅读一些关于结构的东西,可以看看

有一个带有列表的片段:

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”(更改浮雕按钮)可以按索引从条目中更改按钮的浮雕。

使用它们填充
列表
dict
对象。您可以看到昨天提出的类似问题。我对dics不太熟悉,所以我尝试使用列表来完成此操作。在我声明的函数中:全局新按钮;在函数外部,我用以下命令初始化列表:newbutton=[None]*5;然后通过调用函数来填充它:生成_按钮(5);当我这样做时:newbutton[2].config(…)会显示“AttributeError:'NoneType'对象没有属性'config'”。感谢您的帮助!起初,我认为您的方法仅限于更改释压,因为在创建按钮时正确调用了change_relief()-命令,但我对您的解决方案进行了一点尝试,并找到了一些很好的方法将其用于我自己的目的。我认为有帮助的技巧是在函数外部创建按钮列表,但在函数内部追加项目。@offeltoffel,是的,没错!我坚持使用
relieve
选项,只是因为您的问题中提到了它。忘了提到您可以以任何方式(显然)与
按钮
交互,因此此代码段只是一个示例。很高兴,如果真的对你有帮助的话。
myButton.config(padx=10)
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()