【问题标题】:wxPython MenuItem ITEM_CHECK won't uncheckwxPython MenuItem ITEM_CHECK 不会取消选中
【发布时间】:2017-03-17 21:18:26
【问题描述】:

我有这个(我省略了不相关的代码):

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

它不会取消选中自身。即使我将 GetID() 替换为实际 ID 101,它仍然不会取消选中。

我在这里缺少什么?除了我所做的之外,没有太多关于更改此设置的文档,但它不起作用。

【问题讨论】:

  • 这显然是某种错误,如果您最初设置Check(101,True),即使通过可见检查菜单项并打印IsChecked(101)返回True,一旦您在回调函数中,同样的 IsChecked(101) 返回 False ,但该项目仍处于可见检查状态。如果您切换值,则相反。我认为这与TaskBarIcon 有关,因为这显然可以正常工作。
  • 对。而且即使我在函数中输入print(self.menu.chk.GetID()),它也会返回101,这是正确的。但是由于某种原因,Check 功能不起作用。

标签: python wxpython wxwidgets


【解决方案1】:

我使用 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 *

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

【讨论】:

  • 我下班后试试这个。但我想知道为什么他们有两种不同的方法......
  • 好像是个bug
  • 所以当你在我的代码中只使用menu.Append 尝试它时,它对你也不起作用吗?
  • 这并没有什么不同。它的行为与原始代码相同; on_tog 执行,但复选标记没有消失。
  • 好的。如果CreatePopupMenu 绑定到鼠标点击之类的事件,它将被多次调用并每次创建一个新菜单
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 2012-05-30
  • 2018-08-29
相关资源
最近更新 更多