2017-02-08 18 views
0

私はこのプログラムを自分のプログラムで動かすことを切望してきました。基本的にファイルからいくつかのオプションを読み込み、それらのオプションからTkinterボタンを作成したいと思っています。ボタンの作成は問題ありません。現在のところ、私が望む機能をコードに実行させることはできません。このクラスでボタンから外部ソースから関数を呼び出す方法。 [Python]

from Lib import StegosaurMainCode as Steg 
... 
class App: 
    def __init__(self, master, menu): 
     buttons = [] 
     for counter in range(0, len(menu[0])): 
      text = menu[0][counter] 
      func = menu[1][counter] 
      att = menu[2][counter] 
      buttons.append(Button(text=text, command=lambda: Steg.func(att))) 
     frame = Frame(master) 
     for item in buttons: 
      item.pack() 
     frame.pack() 

、funcが、私が呼び出したい関数である、STEGは別のファイルに外部コードで、ATTは、機能のための属性です。 Steg.funcはSTEG内の関数が「FUNC」のではなく、変数func

+0

どのようにStegをインポートしますか? –

+0

あなたが見ることができるようにちょうど編集されます。 –

+0

'menu [1] [counter]'には何がありますか?それは文字列か、関数への実際の参照ですか?質問でコードを実行したときに発生するエラーは何ですか?私たちには知られていない変数に依存するので、実行することはできません。 [最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve) –

答えて

0

に記載したのと呼ばれるあなたのラムダは、各呼び出しでそのattパラメータを再バインド持って呼び出そうとしないだろう、なぜ私が把握するように見えることはできません。 menu[1][counter]が文字列ではなく、実際の関数への参照が含まれていると仮定すると

class App: 
    def __init__(self, master, menu): 
     buttons = [] 
     for counter in range(0, len(menu[0])): 
      text = menu[0][counter] 
      func = menu[1][counter] 
      att = menu[2][counter] 
      buttons.append(Button(text = text, command = lambda att = att: Steg.func(att))) 
     frame = Frame(master) 
     for item in buttons: 
      item.pack() 
     frame.pack() 
0

は、あなたが、その後command属性の値として使用することができます関数への参照を取得する必要があります。あなたはGETATTRでそれを行うことができます:あなたはそれをやったら、それは実際の関数であるかのように、あなたがfuncを使用することができます

func = getattr(steg, menu[1][counter]) 

。しかし、変数を現在の値にバインドする必要がありますので、ラムダの引数として渡す必要があります。

+0

の手順を読み、それに従うと助けになります。こんにちは、ありがとうございました。すばやく分解して、コードの2行目を説明できる可能性はありますか?私はちょっと混乱しますが、それがどのように機能するか理解しています。 –

関連する問題