如何更改tkinter Python中最后单击按钮的文本

0 投票
1 回答
1131 浏览
提问于 2025-04-17 19:17

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

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()

你能告诉我怎么解决这些问题吗?非常感谢 :)

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, ...)

撰写回答