wxPython не привязывает обратные вызовы к событиям должным образом - PullRequest
0 голосов
/ 22 ноября 2010

Вот примерно минимальный наглядный пример:

import wx

app = wx.App(False)
frame = wx.Frame(None)

menuBar = wx.MenuBar()
menu = wx.Menu()
menuBar.Append(menu, "&Menu")
frame.SetMenuBar(menuBar)

for name in ['foo','bar','baz']:
    menuitem = menu.Append(-1,"&"+name,name)
    def menuclick(e):
        print(name)
    frame.Bind(wx.EVT_MENU, menuclick, menuitem)

frame.Show(True)
app.MainLoop()

Проблема в том, что при нажатии на каждый пункт меню выводится «baz». Разве функция menuclick не должна обернуть соответствующее имя в закрытие и сохранить оригинальное имя?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

После того, как цикл for name станет "баз", его значение не вернется во времени, когда вы связали menuclick с событием меню.

Вы можете перейти к пункту менюимя через само событие, как это:

def menuclick(e):
    print(menu.FindItemById(e.Id).Label)
0 голосов
/ 22 ноября 2010

Я нашел это решение, потому что я не уверен, почему это работает, когда внутренняя версия не работает:

from functools import partial

def onclick(name,e):
    print(name)

for name in ['foo','bar','baz']:
    menuitem = menu.Append(-1,"&"+name,name)
    frame.Bind(wx.EVT_MENU, partial(onclick,name), menuitem)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...