【发布时间】:2009-06-18 17:57:24
【问题描述】:
我的界面有两个工具栏,一个附加到框架上,一个嵌入到笔记本选项卡中。框架中的一个尽职尽责地在状态栏中显示 longHelp 字符串,笔记本选项卡中的那个 才不是。如何告诉笔记本选项卡上的人在哪里显示其帮助,还是我必须自己管理进入和离开绑定?
【问题讨论】:
我的界面有两个工具栏,一个附加到框架上,一个嵌入到笔记本选项卡中。框架中的一个尽职尽责地在状态栏中显示 longHelp 字符串,笔记本选项卡中的那个 才不是。如何告诉笔记本选项卡上的人在哪里显示其帮助,还是我必须自己管理进入和离开绑定?
【问题讨论】:
虽然这篇文章已经相当老了,但我自己也偶然发现了同样的问题。使用 wxPython Phoenix 4.0.0a4,我找到的解决方案是使用工具栏的 id 将函数绑定到 EVT_TOOL_ENTER 事件。
your_frame.Bind(wx.EVT_TOOL_ENTER, your_function, id=toolbar_id)
然后在 your_function 中,您可以从工具栏中获取工具,从工具中获取帮助文本并将其写入状态栏。
def your_function(e):
tool_id = e.GetSelection()
if tool_id != -1:
# if the mouse is over a toolbar item
event_object = e.GetEventObject()
tool = event_object.FindById(tool_id)
text = tool.GetLongHelp()
else:
# if the mouse is in the toolbar area, but not on an item
text = some_default_text
your_frame.GetStatusBar().SetStatusText(text)
可以在wxPython docs 中找到 EVT_TOOL_ENTER 的简短说明。
【讨论】:
你在 wxWidgets 中有:
void wxToolBarBase::OnMouseEnter(int id)
{
...
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
if ( frame )
{
...
frame->DoGiveHelp(help, id != wxID_ANY);
}
...
}
在 C++ 程序中,您可以覆盖此函数(只需将 GetParent() 更改为 GetTopLevelParent() 即可)。在 Python 中,如您所写,您只能绑定进入/离开事件并从处理程序调用 DoGiveHelp()。
【讨论】:
来自 wxPython 文档 """ 长帮助字符串 当鼠标指针位于工具内时,此字符串显示在父框架的状态栏(如果有)中 """
因此 notebook 中的工具栏没有任何状态栏来显示长帮助,因此我们应该通过 src 来调查它如何查询 abt 状态栏并为主框架状态栏提供参考
否则我认为更好的方法是覆盖 wxToolBar::OnMouseEnter 并直接在状态栏上显示帮助
【讨论】: