2011-11-14 11 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関数から呼び出されるコールバック関数は、変数名、インデックス、およびモードという3つの引数を常に受け​​取ります。これらのどれも本当に興味深いものではありませんが、あなたの関数はコールバックが動作するためにこのシグネチャと一致する必要があります。それを修正する

は、このように見えるようにあなたのコールバック関数を変更します。あなたはそれを好む場合は、あなたも一緒に(きれいな関数定義を維持するためにtrace呼び出しでlambdaを置くことができる

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

)「あなたがそれらを使用しない場合は、なぜそこに変数を定義する」、の行:

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

あなたのコールバックは、このケースであるとして残ることができます。

関連する問題