python - 禁用在 wxPython 中根据名称动态创建的按钮

标签 python 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

然后在链接到另一个小部件的函数中,我需要能够根据用户提供的一些名称禁用其中一些按钮。
如何在不是由该按钮触发的函数中根据其名称禁用该按钮?

最佳答案

如何使用字典将按钮名称映射到按钮/索引(到数据项)?

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
    #    ^^^^^^^^^^^^^^^^

关于python - 禁用在 wxPython 中根据名称动态创建的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426561/

相关文章:

python - 在 python 和 numpy 中处理大数据,没有足够的内存,如何将部分结果保存在磁盘上?

python - 在 linux 中是否可以在没有 root 用户权限的情况下捕获 HID 键盘事件

python - 如何在终端中动态打印字符串表?

WXpython教程

python - 全局名称 'img' 未定义?

python - 无法关闭Python应用程序

python - 如何在 Django 上构建幻想体育分析网站的后端?

python - Apache2 CGI 配置

python - wxPython:wx.PyControl可以包含wx.Sizer吗?