【问题标题】:How to change the text of the last clicked button in tkinter python如何在 tkinter python 中更改最后点击按钮的文本
【发布时间】:2013-03-16 00:40:44
【问题描述】:

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

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

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

【问题讨论】:

  • 编辑了关于当前状态的问题,谢谢
  • 我已经用更详细的解决方案更新了答案

标签: python button text tkinter


【解决方案1】:

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

改用事件&lt;Button-1&gt;

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

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

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

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

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

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

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

AuxName.grid(row=x, column=y, ...)

【讨论】:

  • 太棒了,非常感谢,现在一切正常,我从你的回答中学到了很多:)
  • @user2138906 不客气,请随时接受答案以帮助其他人知道这解决了您的问题;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2016-02-29
  • 2020-08-02
  • 1970-01-01
  • 2015-06-04
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多