wxPython: comment faire en sorte que deux barres d'outils utilisent une barre d'état pour les info-bulles?
Question
J'ai une interface qui a deux barres d'outils, l'une attachée au cadre et l'autre incorporée dans un onglet de bloc-notes. Celui du cadre affiche consciencieusement les chaînes longHelp dans la barre d'état, celui de l'onglet du bloc-notes. ne fait pas. Comment puis-je indiquer à l'onglet de l'ordinateur portable où afficher son aide ou dois-je gérer moi-même les entrées et les sorties?
La solution
Vous avez dans wxWidgets:
void wxToolBarBase::OnMouseEnter(int id)
{
...
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
if ( frame )
{
...
frame->DoGiveHelp(help, id != wxID_ANY);
}
...
}
Dans le programme C ++, vous pouvez remplacer cette fonction (il suffit de changer GetParent () pour GetTopLevelParent () devrait fonctionner). En Python, vous pouvez uniquement, comme vous l'avez écrit, lier des événements d'entrée / sortie et appeler DoGiveHelp () à partir de gestionnaires.
Autres conseils
Bien que ce message soit relativement ancien, je suis moi-même tombé sur le même problème. En utilisant wxPython Phoenix 4.0.0a4, la solution que j'ai trouvée consistait à lier une fonction à l'événement EVT_TOOL_ENTER à l'aide de l'ID de la barre d'outils.
your_frame.Bind(wx.EVT_TOOL_ENTER, your_function, id=toolbar_id)
Ensuite, dans votre_fonction, vous pouvez obtenir l’outil de la barre d’outils, le texte d’aide de cet outil et l’écrire dans la barre d’état.
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)
Une brève description de EVT_TOOL_ENTER est disponible dans Docs wxPython .
à partir de la documentation wxPython " " longHelpString Cette chaîne est affichée dans la barre d'état (le cas échéant) du cadre parent lorsque le pointeur de la souris est à l'intérieur de l'outil. """
pour que la barre d’outils dans le bloc-notes n’affiche aucune aide importante dans la barre d’état, nous devons donc inverser la façon dont elle interroge la barre d’état et fournir une référence à la barre d’état du cadre principal
sinon, je pense que le meilleur moyen est de simplement remplacer wxToolBar :: OnMouseEnter et d'afficher l'aide directement sur la barre d'état