Python 2.7 Python Tkinter:如何配置在循环中生成的按钮?
我正在使用Python2.7和Tkinter为我的代码制作GUI。 在某一点上,一个框架中充满了循环中的许多按钮。当我单击其中一个按钮时,该函数需要知道从何处调用,因此我在谷歌上搜索并找到了一种很好的方法: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
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()