0

我通过循环列表动态创建了一个按钮:

AuxName = Button(GUI_1, text=List_Aux[x], font=("Arial", 10))
tk_rgb = "#%02x%02x%02x" % (0,0,0)
AuxName["fg"] = tk_rgb
tk_rgb = "#%02x%02x%02x" % (255,255,255)
AuxName["bg"] = tk_rgb
AuxName.place(x=BUTTON_LEFT_AUX1, y=BUTTON_TOP_AUX1 , height=BUTTON_HEIGTH_AUX1, width=BUTTON_WIDTH_AUX1)
AuxName["command"] = ButtonClick

每个按钮都有一个不同的 AuxName 值(1btn1、1btn2、1btn3 等)数字是每个按钮所在的列和行。

我遇到的问题是,现在我希望该函数ButtonClick获取被单击的按钮的名称。我尝试的最后一件事是:

def ButtonClick():
1btn1["text"] = "Goodbye"

但是 python 会抛出一个语法错误(并且指向左括号之前)。

如何获取最后点击的按钮名称,然后通过函数更改其文本ButtonClick()

-------------------- 编辑第一个答案,现在几乎可以正常工作------------

感谢您的回答,我非常感谢,并使其工作几乎完美。有两个缺陷,首先是它会抛出一个错误,因为发送的命令 ButtonClick 没有参数,这是发送按钮绑定命令的默认方式,所以我真的不知道如何解决这个问题......第二个是,在使用您提供给我的代码后,按钮文本将按照您的指定更改,但它们不会尊重我之前定义的位置和大小。

BUTTON_TOP_AUX1 = 20
BUTTON_WIDTH_AUX1 = 400
BUTTON_LEFT_AUX1 = 5
BUTTON_HEIGTH_AUX1 = 20
Buttons_Function = "DesiredFunctionOne"
BUTTON_COLUMN_AUX1 = 1
List_Size_Aux = len(List_Aux)
for x in range ( List_Size_Aux ):
    AuxName = str(BUTTON_COLUMN_AUX1)+'btn'+str(x)
    AuxName = Button(GUI_1, text=List_Aux[x], font=("Arial", 10))
    tk_rgb = "#%02x%02x%02x" % (0,0,0)
    AuxName["fg"] = tk_rgb
    tk_rgb = "#%02x%02x%02x" % (255,255,255)
    AuxName["bg"] = tk_rgb
    AuxName.place(x=BUTTON_LEFT_AUX1, y=BUTTON_TOP_AUX1 , height=BUTTON_HEIGTH_AUX1, width=BUTTON_WIDTH_AUX1)
    AuxName["command"] = ButtonClick
    BUTTON_TOP_AUX1 = BUTTON_HEIGTH_AUX1+BUTTON_TOP_AUX1
    AuxName.bind("<Button-1>", ButtonClick)
    AuxName.pack()

你能告诉我如何解决这些问题吗?非常感激 :)

4

1 回答 1

1

首先,您必须将函数绑定到事件,而不是使用command属性。要左键单击小部件,请删除该行

并改用该事件<Button-1>

AuxName.bind("<Button-1>", ButtonClick)

然后在事件处理程序中,您会收到一个事件参数。它有一个widget字段,因此您可以获得触发事件的小部件:

def ButtonClick(event):
    event.widget['text'] = 'Goodbye'

请记住,您必须删除AuxName['command'] = ButtonClick,因为如果您不这样做,ButtonClick将执行两次(其中一次没有任何参数)。

当您更改按钮的文本时,它也会修改其宽度,因为新文本可能有不同的长度。关于小部件位置的一个问题是您同时使用placepack作为几何管理器:

AuxName.place(...)
# ...
AuxName.pack()

在 Tkinter 中,您应该始终使用一个几何管理器。在这种情况下,我建议您使用最容易使用的网格几何管理器:

AuxName.grid(row=x, column=y, ...)
于 2013-03-16T01:50:13.883 回答