如何更改tkinter Python中最后单击按钮的文本
我通过循环一个列表动态创建了一些按钮:
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 个回答
首先,你需要把函数绑定到一个事件上,而不是使用 command
属性。比如说,如果你想在一个小部件上处理左键点击,就要去掉这一行:
然后使用事件 <Button-1>
来替代:
AuxName.bind("<Button-1>", ButtonClick)
在事件处理函数中,你会收到一个事件参数。这个参数里有一个 widget
字段,这样你就可以获取触发事件的小部件:
def ButtonClick(event):
event.widget['text'] = 'Goodbye'
记得要去掉 AuxName['command'] = ButtonClick
这一行,因为如果不去掉的话,ButtonClick
会被执行两次(其中一次没有任何参数)。
当你改变按钮的文本时,它的宽度也会随之改变,因为新文本的长度可能不同。关于小部件的位置,你会遇到一个问题,就是你同时使用了 place
和 pack
这两种布局管理器:
AuxName.place(...)
# ...
AuxName.pack()
在 Tkinter 中,你应该始终使用一种布局管理器。在这种情况下,我建议你使用 网格布局管理器,因为它是最简单的使用方式:
AuxName.grid(row=x, column=y, ...)