如何在tkinter中动态改变按钮文本?

3 投票
1 回答
4215 浏览
提问于 2025-04-17 06:17

我有一个下拉菜单和一个按钮。我想根据下拉菜单中的选择来改变按钮上的文字。我用了trace这个方法,但出现了这个错误:

TypeError: change_button_text() takes no arguments (3 given)

这是一个例子:

from Tkinter import*
import Tkinter as tk
import os


def change_button_text():
    buttontext.set(widget1.get())

app=Tk()
app.title("Example")
app.geometry('200x200+200+200')

widget1 = StringVar()
widget1.set('Numbers')
files =["one",'two','three']
widget1DropDown = OptionMenu(app, widget1, *files)
widget1DropDown.config(bg = 'white',foreground='black',font=("Times",16,"italic"))
widget1DropDown["menu"].config(bg = 'white',font=("Times",12,"italic"))
widget1DropDown.pack()
widget1.trace("w", change_button_text)


buttontext=StringVar()
buttontext.set('Zero')
button1=Button(app,textvariable=buttontext,font=("Times", 16),width=15,borderwidth=5)
button1.pack(side=LEFT, padx=5,pady=8)


app.mainloop()

有什么想法吗?谢谢。

1 个回答

1

把你的 change_button_text 函数的定义改成可以接收参数。被 trace 函数调用的回调函数总是会收到三个参数:变量的名字、索引和模式。这三个参数其实没什么特别的,但你的函数必须符合这个格式,才能让回调正常工作。

要解决这个问题,可以把你的回调函数改成这样:

def change_button_text(name, index, mode):
    buttontext.set(widget1.get())

如果你愿意的话,也可以在 trace 调用中使用一个 lambda 表达式,这样可以让函数的定义看起来更简洁(就像是,“如果你不打算用这些变量,那为什么要在这里定义它们”):

widget1.trace("w", lambda n, i, m: change_button_text())

在这种情况下,你的回调函数可以保持不变。

撰写回答