wxPython MenuItem ITEM_CHECK不会取消选中

时间:2017-03-17 21:18:26

标签: python wxpython wxwidgets

我有这个(我遗漏了与之无关的代码):

class TaskBarIcon(wx.TaskBarIcon):

    def __init__(self, frame):
        self.frame = frame
        super(TaskBarIcon, self).__init__()

    def CreatePopupMenu(self):
        self.menu = wx.Menu()
        self.menu.chk = self.menu.Append(101, 'Show statubar', 'Show Statusbar', kind=wx.ITEM_CHECK)
        self.menu.Check(101, True)
        self.Bind(wx.EVT_MENU, self.on_tog, id=101)
        return self.menu

哪个有效,并且菜单上的检查就在那里。这是Linux中的系统托盘图标,带有右键单击菜单。

但是当我这样做时:

def on_tog(self, event):
    self.menu.Check(self.menu.chk.GetId(), False)  #Uncheck running box

它没有取消选中。即使我用实际ID 101替换GetID(),它仍然没有取消选中。

我在这里缺少什么?除了我所做的以外,没有太多关于改变这个的文档,但它没有用。

1 个答案:

答案 0 :(得分:0)

我使用AppendCheckItem

开始工作
self.menu.chk = self.menu.AppendCheckItem(101, 'Show statubar', 'Show Statusbar')

其余代码应按预期工作。

<强>更新

以下是我的代码的相关部分

MENU_ITEM_ID = wx.NewId()

<强> ...

self.menu_item = self.menu.AppendCheckItem(MENU_ITEM_ID, "Test Menu Item")

<强> ...

self.menu.Bind(wx.EVT_MENU, self.toggle_menuitem, id=MENU_ITEM_ID)

<强> ...

def toggle_menuitem(self, event):
    self.menu_item.Check(self.menu_item.IsChecked() == False) # toggle checkmark

更新#2 *

在评论中进行了长时间的讨论后,确定OP将CreatePopupMenu方法绑定到右键单击事件。这样每次都重新创建了wx.Menu,从而擦除了分配给上一个菜单的任何状态。要解决此问题,只需在父类中创建一个跟踪复选标记值的标记,并在创建弹出菜单后将其设置为正确状态,然后调用self.menu_item.Check(self.is_checked)