私はクリックすると特定の文字列を含むメニューを表示する必要があるmenubuttonを持っています。そのシーケンス内の文字列はまさに実行時までわからないので、ポップアップするメニューはその時点で生成されなければなりません。仮定menu_tagsがリストである[「スタック」、「以上」、「流れ」] - ここに私が持っているものです::Tkinterのメニューを動的に作成します。 (ラムダ式?)
class para_frame(Frame):
def __init__(self, para=None, *args, **kwargs):
# ...
# menu button for adding tags that already exist in other para's
self.add_tag_mb = Menubutton(self, text='Add tags...')
# this menu needs to re-create itself every time it's clicked
self.add_tag_menu = Menu(self.add_tag_mb,
tearoff=0,
postcommand = self.build_add_tag_menu)
self.add_tag_mb['menu'] = self.add_tag_menu
# ...
def build_add_tag_menu(self):
self.add_tag_menu.delete(0, END) # clear whatever was in the menu before
all_tags = self.get_article().all_tags()
# we don't want the menu to include tags that already in this para
menu_tags = [tag for tag in all_tags if tag not in self.para.tags]
if menu_tags:
for tag in menu_tags:
def new_command():
self.add_tag(tag)
self.add_tag_menu.add_command(label = tag,
command = new_command)
else:
self.add_tag_menu.add_command(label = "<No tags>")
重要な部分は、「もしmenu_tags」の下でのものです。そして、私がやりたいことを効果的にこれです:ように
def add_tag_stack():
self.add_tag('stack')
と:
self.add_tag_menu.add_command(label = 'stack', command = add_tag_stack)
self.add_tag_menu.add_command(label = 'over', command = add_tag_over)
self.add_tag_menu.add_command(label = 'flow', command = add_tag_flow)
add_tag_stackは()として定義されます。
変数 'tag'は 'stack'の値をとり、 'over'などの値をとり、new_commandが呼び出されるまで評価されません。その時点で変数 'tag 'は単に「流れ」です。したがって、追加されるタグは、ユーザーが何をクリックしていても常にメニューの最後のタグです。
私はもともとラムダを使用していましたが、上記のように関数を明示的に定義するほうが効果的かもしれません。どちらの方法でも問題が発生します。私は変数 "タグ"( "current_tag =タグ"またはコピーモジュールを使用して)のコピーを使用しようとしましたが、それは解決しません。なぜ私は分からない。
私の心は「eval」のようなものに向かってさまよっていますが、私は誰かがそのような恐ろしいものを含まない賢い方法を考えることができると考えています。
多くの感謝!
(ケースでは、Tkinterの.__ version__戻り、関連するのです。 '$リビジョン:67083 $' と私はWindows XP上のPython 2.6.1を使用しています)
Tkinter特有の解決策があったかもしれないと思いました。誰かが「いいえ、いいえ、あなたがやる方法は特別な関数Tkinter.somethingOrOther()です」と言っています。助けてくれてありがとう! – MatrixFrog
問題ありません!私はちょうどいい最初のステップは、問題の小さな例を切り離して、それが言語の問題かAPIの問題かを見極めることです。 –