2013-12-06 5 views
1

В проекте wxPython у меня есть куча кнопок, которые создаются динамически. Вот минимальный упрощенный пример:Отключить кнопки, созданные динамически на основе их имени в wxPython

data = [{'name':'a', 'n':0}, {'name':'b', 'n':0}, {'name':'c', 'n':0}, {'name':'d', 'n':0}...] 
button_names = ['a','b','c','d',...] 
button_lab = ['A','B','C','D',...] 
N = len(button_names) 
g = wx.GridSizer(math.ceil(N/4),4,0,0) 
for i in range(0, N-1): 
    b = wx.Button(self, wx.ID_ANY, name=button_names[i], label=button_lab[i]) 
    b.Bind(wx.EVT_BUTTON, self.OnClick) 
    g.Add(b, 1, wx_ALL, 5) 

С OnClick функции, такие как это:

def OnClick(self,event): 
    button = event.GetEventObject() 
    d = button.GetName() 
    [k for k in data if k['name']==d][0]['n'] += 1 

Затем в функции, связанной с другим виджетом, мне нужно, чтобы иметь возможность отключить некоторые из них на основе некоторых имен, предоставленных пользователем.
Как отключить кнопку, основанную на ее имени, в функции, которая не запускается этой кнопкой?

+0

Почему бы вам не использовать словарь? – falsetru

+0

Можете ли вы уточнить? – plannapus

+0

Я отправил ответ. Проверьте это. – falsetru

ответ

1

Как насчет использования словаря для сопоставления имени кнопки для buttton/index (для элементов данных)?

data = [{'name':'a', 'n':0}, {'name':'b', 'n':0}, {'name':'c', 'n':0}, {'name':'d', 'n':0}...] 
button_names = ['a','b','c','d',...] 
button_lab = ['A','B','C','D',...] 
N = len(button_names) 
g = wx.GridSizer(math.ceil(N/4),4,0,0) 
name_to_index = {} # <------- 
button_map = {} # <------- 
for i in range(0, N-1): 
    b = wx.Button(self, wx.ID_ANY, name=button_names[i], label=button_lab[i]) 
    name_to_index[button_names[i]] = i # <------- 
    button_map[button_map[i]] = b  # <------- 
    b.Bind(wx.EVT_BUTTON, self.OnClick) 
    g.Add(b, 1, wx_ALL, 5) 

def OnClick(self,event): 
    button = event.GetEventObject() 
    d = button.GetName() 
    data[name_to_index[d]]['n'] += 1 
    # ^^^^^^^^^^^^^^^^ 
+0

Хорошо, тогда, когда я хочу отключить один из них, я иду 'button_map [name] .Enable (False)'? – plannapus

+0

@plannapus, Да, это так. – falsetru

+0

ОК, спасибо, спасибо! – plannapus

Смежные вопросы