2016-05-11 6 views
0

カスケードメニューバーに名前のリストがあり、名前をクリックすると、関連付けられたIDが関数に渡されます。たとえば、 'Test1'をクリックすると、ID 4556767が関数に渡されます。変数をハードコードされた値に効果的に変換する方法

私はそれを行う方法を理解できません。私は列挙型を使用して、 'コマンド'引数としてラムダ関数に整数を渡してから、メニュー項目のインデックスに対応するIDのリストを設定しようとしました。しかし、これは各反復でコース変更の列挙変数として機能しませんでしたので、最終的にはすべての項目が同じ値を返します。

変数を永続的に保持し、変数ではなくハードコードされているかのように変更する方法はありますか?私はそれを行うことができれば、私はちょうどすぐにそうようなIDを渡すこともできますが

blogs = database_handler.get_blogs()          
self.blog_menu_ids = []             

for i, blog in enumerate(blogs):           
    self.blog_menu_ids.append(blog[0])         
    self.menu_blogs.add_command(label=blog[1],       
           command=lambda: self.load_blog(i)) 

blogs = database_handler.get_blogs()            

for blog in blogs:              
    self.menu_blogs.add_command(label=blog[1],       
           command=lambda: self.load_blog(blog[0])) 
+0

を、これはのちょうど別の例であります拘束力のある封鎖。 –

+0

デフォルトの引数、つまり 'command = lambda id = blog [0]:self.load_blog(id)'を試してみてください。 – martineau

答えて

3

あなたは私たちが「部分関数適用」を使用して行うことができます「事前バインディング」したい重複に合意した

for blog in blogs: 
    self.menu_blogs.add_command(label=blog[1], 
           command=partial(self.load_blog, blog[0])) 
+0

パーフェクト、魅力を発揮します。ありがとうございました。 –

+0

@JamalMoirこれは、既に使用している 'lambda'式と同じことを行うべきです、これはどう違うのですか? –

+1

これは同じことではありません。以前の関数では、lambda関数がiの値を渡していました。これは、GUIが生成された後のループの最後にxでした。だからあなたがクリックしたすべてのボタンはid xを持ち出しました。 –

0

私は完全にあなたの質問を理解していない。ここ

は私の現在のコードですそれは見えますが、あなたはすでにとても近いですか?

for blog in blogs:                   
    self.menu_blogs.add_command(label=blog[1], command=lambda: self.load_blog(blog[0])) 

私はblog[0]のIDを保持しblog[1]はそれの名前であると仮定。

編集:あなたが編集されたので、同じ回答があります。

from functools import partial 

for i, blog in enumerate(blogs): 
    self.blog_menu_ids.append(blog[0]) 
    self.menu_blogs.add_command(label=blog[1], 
           command=partial(self.load_blog, i)) 

またはあなたの第二の例以下:

関連する問題