2011-11-14 72 views
3

我有一个下拉菜单,一个button.I我试图改变根据使用跟踪下拉menu.I选择按钮上的文本,但给了我这个错误:如何动态更改tkinter中按钮的文本?

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

将您的函数定义change_button_text更改为接受参数。从trace函数调用的回调函数将始终接收三个参数:变量的名称,索引和模式。这些都不是真的有趣,但你的功能需要匹配这个签名的回调工作。

要修复它,改变你的回调函数看起来像这样:

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

如果你喜欢它,你也可以把lambdatrace呼叫保持函数定义清洁(沿的,线“为何定义变量那里,如果你没有使用这些”):

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

你的回调可以保持原样在这种情况下。