每次在Tkinter中如何访问一个不同的按钮?

时间:2019-10-14 19:16:31

标签: python tkinter

我创建了九个按钮,如下所示:

MyButton1 = Button(game, text="BUTTON1", image=pixel, compound="c", width=200, height=200, command=callback(1))
MyButton1.grid(row=0, column=0)

MyButton2 = Button(game, text="BUTTON2", image=pixel, compound="c", width=200, height=200, command=callback(2))
MyButton2.grid(row=1, column=0)

MyButton3 = Button(game, text="BUTTON3", image=pixel, compound="c", width=200, height=200, command=callback(3))
MyButton3.grid(row=2, column=0)

# and so on

我想在单击特定按钮时更改其文本,并且我知道button.config可用于更改该按钮的某些内容。例如,如果我想更改MyButton1的文本,则可以执行以下操作:MyButton1.config(text="X")。但是我认为为每个按钮的command提供不同的功能会很麻烦,因此我可以创建一个如下功能:

def callback(id):
    print(id)
    # change the text of the button

但是,我的问题是,每次尝试获取的按钮不同时,我不知道如何访问该按钮。由于明显的原因(这是一个字符串),我无法执行"MyButton" + str(id).config。那我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

首先定义按钮,然后将其放置在回调中

def changetext(button):
  button.config(text="Changed text")

b = Button(master, text="Text here")
b.config(command=lambda button=b: changetext(button))

答案 1 :(得分:2)

使用按钮列表。您可以在lambda命令中引用索引。

通过使用列表存储按钮,我们可以引用它们的索引以执行所需的操作。当动态或大量使用小部件时,这非常有用。这样,我们可以构建一个简单的函数来获取列表的索引,以编辑所需的内容。 Lambda可以很好地为循环中的每个按钮设置命令。

请注意,您不能简单地执行command= update_button(x),因为这将调用创建按钮实例的函数,而不是等待您按下按钮。这是因为在命令中我们调用了函数,而不是保存对该函数的引用。为了保存对函数的引用,我们只需省略括号command= update_button

也就是说,在这种情况下,我们确实需要向其传递变量,因此,为了执行此操作,我们可以在命令中编写一个名为lambda的无名函数以执行另一个命令,同时还要传递变量。

import tkinter as tk


def update_button(ndex):
    button_list[ndex].config(text='x')


root = tk.Tk()

button_list = []
for i in range(9):
    button_list.append(tk.Button(root, text='Button {}'.format(i), command=lambda x=i: update_button(x)))
    button_list[-1].pack(fill='x')

root.mainloop()

结果应用程序,其中已按下几个按钮:

enter image description here

这是一个使用网格并结合一些数学运算来处理网格在列和行中放置的示例。

import tkinter as tk


def update_button(ndex):
    button_list[ndex].config(text='x')


root = tk.Tk()

button_list = []
row = 0
column = 0
for i in range(15):
    button_list.append(tk.Button(root, text='Button {}'.format(i+1), command=lambda x=i: update_button(x)))
    button_list[-1].grid(row=row, column=column, sticky='ew')
    if row % 4 == 0 and row != 0:
        column += 1
        row = 0
    else:
        row += 1

root.mainloop()

结果:

enter image description here

如果您希望先运行列,然后再行,则只需翻转数学即可:

if column % 4 == 0 and column != 0:
    row += 1
    column = 0
else:
    column += 1

结果:

enter image description here