私はPythonのtkinter
モジュールを初めて使用しているので、何か助けてくれてありがとうと思っています。lambdaコマンドを使用するとPython tkinter NameErrorが発生する
私は、フォームの4タプルのリストを持っています(foo, bar, x, y)
;このような何か:理想的な機能を有する各ボタンで、テキストbar
とボタンとして変数をインスタンス化しfoo
TUPLE_LIST = [('Hello', 'World', 0, 0),
('Hovercraft', 'Eels', 50, 100),
etc.]
以降for
ループは、それぞれにbar
がすでに定義されたその場所をEntry
ウィジェットを追加しますそれ座標x, y
で:
for foo, bar, x, y in TUPLE_LIST:
exec("{0} = Button(self, text='{1}', command=lambda: self.update_text('{1}'))".format(foo, bar))
eval(name).place(x=x, y=y)
ボタンが完全に置くが、私はそれらのいずれかをクリックして行けば、私は次のエラーを取得:
を Traceback (most recent call last):
File "...\lib\tkinter\__init__.py", line 1550, in __call__
return self.func(*args)
File "<string>", line 1, in <lambda>
NameError: name 'self' is not defined
これは、コマンドがラムダで定義されているため、定義された「関数」ではないということが関係していると思いますが、ラムダとのコマンド。それではexec
も使用するのですか? (それが重要な場合)。また、ここではupdate_text
のためのコードは次のとおりです。
def update_text(self, new_char):
old_str = self.text_box_str.get()
# Above is a StringVar() defined in __init__ and used as textvariable in Entry widget creation.
self.text_box_str.set(old_str + new_char)
すべてのヘルプははるかに高く評価されるだろう。前もって感謝します。
OKで、これらの4行を置き換えることができますが、それはまだ元の問題を解決していません。どうすればこれらのボタンを作成して、それぞれの 'bar'を' Entry'ウィジェットに追加する 'コマンド'を持つようにできますか?なぜなら、 'exec'呼び出しで文字列フォーマット以外のことをする方法は考えられないからです。それが問題を引き起こしていたようです。そして、はい、私はクラスを使っています(しかし、問題を引き起こしていた「自己」は私のものでさえありませんでした)。 – ENPM
@ENPM:構築された文字列で 'exec'を呼び出すことに頼らざるを得ません。関数を呼び出して更新するウィジェットを渡す方法を示すために私の答えを更新しました。この関数はウィジェットの名前を知る必要はなく、ウィジェット自体への参照を与えることができます。 –
OK、ありがとう!私はその代わりに行くだろう。 – ENPM