2017-12-09 3 views
0

こんにちは、 私は奇妙なエラーに悩まされているので、カスケードメニューでボタンを使いたいと思っています。 。次のようにTkinter:メニューのボタンをクリックすると、間違った引数で機能が起動する

コードは次のとおりです。

from tkinter import * 

def say_hi(name): 
    print(name) 

root = Tk() 

menu = Menu(root) 
root.config(menu=menu) 

subjects_menu = Menu(menu) 
menu.add_cascade(label="Subjects", menu=subjects_menu) 

d = ["name1", "name2"] 
for name in d: 
    subjects_menu.add_command(label=name, command=lambda:say_hi(name)) 

''' 
this is also not working 

name = "Math" 
subjects_menu.add_command(label=name, command=lambda:say_hi(name)) 
name = "Physics" 
subjects_menu.add_command(label=name, command=lambda:say_hi(name)) 
''' 

root.mainloop() 

だから私は(私はそれらの数を予測することはできません)コンソールでクリックしたボタンの名前を印刷し、そして反復ではなく、一つ一つで、ボタンを追加したい

プログラムの実行後、エラーは表示されず、ウィンドウが表示されます。どちらのボタンをクリックしても、コンソールは「名前2」を表示します。 私はいくつかの名前を追加しました - それは常に最後のオプションの名前を表示します。

おかげで、事前に

答えて

0

ラムダはトリッキーですが、あなたは、ラムダ引数でやりたいことができます。

for name in d: 
    subjects_menu.add_command(label=name, command=lambda x=name:say_hi(x)) 

これはあなたの問題を解決する必要があります。

+0

[OK]を、おかげでたくさん。最初にラムダを使用 –

1

これを実行する別の(IMOすっきり)の方法は、functools.partialを使用することです:

from functools import partial 

for name in d: 
    subjects_menu.add_command(label=name, command=partial(say_hi, name)) 
+0

良い情報。 functoolsモジュールにたくさんの良いものが埋め込まれています。 – Gary02127

+0

私は 'neater'に同意します –

関連する問題