工具栏工具 - 位图切换
Toolbar tool - bitmap toggle
我正在使用 wxpython 2.8,这可能会使事情变得稍微困难一些。
我正在尝试在工具栏中创建一个按钮,如果它被切换,它只会更改其位图。只要切换开关发生变化,位图就会变为相应的图标。
鉴于此功能似乎不是内置的,而且我不想将我的控件与我的视图混合得太紧密,我很快尝试了这个:
class ToggleToolBarBase(wx.ToolBarToolBase):
"""A ToolBar Button with bitmaps which is meant to be toggled."""
def __init__(self, tbar=None, toolid=wx.ID_SEPARATOR, label="",
bmpOff=wx.NullBitmap, bmpOn=wx.NullBitmap,
kind=wx.ITEM_NORMAL, clientData=None,
shortHelpString="", longHelpString=""):
# super(ToggleToolBarBase, self).__init__(self, tbar, toolid, label,
# bmpOff, bmpOn,
# kind, clientData,
# shortHelpString,
# longHelpString)
# Which constructor can I use?
super(ToggleToolBarBase, self).__init__()
self.tbar = tbar
self.bmpOff = bmpOff
self.bmpOn = bmpOn
self.toggle = False
def Toggle(self):
super(ToggleToolBarBase, self).Toggle()
self.toggle = not self.toggle
@property
def toggle(self):
return self._toggle
@toggle.setter
def toggle(self, value):
self._toggle = value
if value is False:
self.SetNormalBitmap(self.bmpOff)
elif value is True:
self.SetNormalBitmap(self.bmpOn)
self.tbar.Realize()
self.tbar.Refresh()
所有 toolbar.AddLabelTool() 函数 return ToolBarToolBase
所以我想我可以简单地扩展它,但是没有构造函数工作,看起来它只是 c++ 的代理class.
我尝试了其他几种方法,但似乎没有任何效果。当然必须有一个简单的解决方案。我想这是经常实施的。
你是对的,ToolBarToolBase
不打算以这种方式用作 public API 的一部分。它更像是一种内部使用 class,您可以以有限的方式使用它来获取有关工具栏项目的一些信息。从 add 工具方法返回的实际上是一个特定于平台的派生 class,它协助 wx class 与本机工具栏小部件进行交互。
要在切换工具 (kind=wx.ITEM_CHECK
) 时更改位图,您需要在单击工具时调用的事件处理程序中自行交换图像。您可以使用 theToolBar.SetToolNormalBitmap(id, new_bmp)
之类的东西。您可能需要在至少某些平台上再次调用 theToolBar.Realize()
才能让工具栏获取新图像。
我正在使用 wxpython 2.8,这可能会使事情变得稍微困难一些。
我正在尝试在工具栏中创建一个按钮,如果它被切换,它只会更改其位图。只要切换开关发生变化,位图就会变为相应的图标。
鉴于此功能似乎不是内置的,而且我不想将我的控件与我的视图混合得太紧密,我很快尝试了这个:
class ToggleToolBarBase(wx.ToolBarToolBase):
"""A ToolBar Button with bitmaps which is meant to be toggled."""
def __init__(self, tbar=None, toolid=wx.ID_SEPARATOR, label="",
bmpOff=wx.NullBitmap, bmpOn=wx.NullBitmap,
kind=wx.ITEM_NORMAL, clientData=None,
shortHelpString="", longHelpString=""):
# super(ToggleToolBarBase, self).__init__(self, tbar, toolid, label,
# bmpOff, bmpOn,
# kind, clientData,
# shortHelpString,
# longHelpString)
# Which constructor can I use?
super(ToggleToolBarBase, self).__init__()
self.tbar = tbar
self.bmpOff = bmpOff
self.bmpOn = bmpOn
self.toggle = False
def Toggle(self):
super(ToggleToolBarBase, self).Toggle()
self.toggle = not self.toggle
@property
def toggle(self):
return self._toggle
@toggle.setter
def toggle(self, value):
self._toggle = value
if value is False:
self.SetNormalBitmap(self.bmpOff)
elif value is True:
self.SetNormalBitmap(self.bmpOn)
self.tbar.Realize()
self.tbar.Refresh()
所有 toolbar.AddLabelTool() 函数 return ToolBarToolBase
所以我想我可以简单地扩展它,但是没有构造函数工作,看起来它只是 c++ 的代理class.
我尝试了其他几种方法,但似乎没有任何效果。当然必须有一个简单的解决方案。我想这是经常实施的。
你是对的,ToolBarToolBase
不打算以这种方式用作 public API 的一部分。它更像是一种内部使用 class,您可以以有限的方式使用它来获取有关工具栏项目的一些信息。从 add 工具方法返回的实际上是一个特定于平台的派生 class,它协助 wx class 与本机工具栏小部件进行交互。
要在切换工具 (kind=wx.ITEM_CHECK
) 时更改位图,您需要在单击工具时调用的事件处理程序中自行交换图像。您可以使用 theToolBar.SetToolNormalBitmap(id, new_bmp)
之类的东西。您可能需要在至少某些平台上再次调用 theToolBar.Realize()
才能让工具栏获取新图像。