2017-08-17 4 views
1

Jusqu'à présent, je n'ai pas réussi à créer ce qu'on appelle familièrement une «icône d'information» avec wxPython. Une icône avec une sorte d'image 'i' qui montre une grande info-bulle sur le vol stationnaire.Comment créer une icône d'information avec wxPython

Je peux ajouter un wx.StaticBitmap pour l'image mais il ignore tous les appelsou SetToolTip(wx.ToolTip()). OU Je peux ajouter une grande pointe d'outil à un wx.StaticText comme indiqué ci-dessous. Ignorez que l'icône n'a pas encore la taille correcte. Inutile de dire que l'infobulle a éventuellement besoin d'une couleur d'arrière-plan différente de la couleur d'arrière-plan du panneau (pas le focus ici). Je ne peux pas utiliser wx.adv.RichToolTip parce que je suis sur wxPython 3.0.2.0 osx-cacao.

Quelle est une bonne façon de résoudre ce problème?

Répondre

1

Si tout ce que vous voulez faire est de montrer une info-bulle lorsque l'image est moucheté sur, vous devez lier votre instance de la wx.StaticBitmap à EVT_MOTION:

import wx 

class MyPanel(wx.Panel): 

    def __init__(self, parent): 
     wx.Panel.__init__(self, parent) 

     bmp = wx.ArtProvider.GetBitmap(wx.ART_WARNING) 
     self.image = wx.StaticBitmap(self, bitmap=bmp) 

     self.image.Bind(wx.EVT_MOTION, self.on_mouse_over) 

    def on_mouse_over(self, event): 
     self.image.SetToolTipString('BLAH BLAH BLAH') 


class MyFrame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, title='Icon Mouser') 
     panel = MyPanel(self) 
     self.Show() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MyFrame() 
    app.MainLoop() 

Quand je lance ce code, je reçois quelque chose comme ceci:

enter image description here

+0

Je pense que le problème est que, sur osx-cacoa, 'StaticBitmap' refuse la chaîne' SetToolTipString'. Comme je ne suis pas un utilisateur de ce système d'exploitation, je ne peux pas commenter d'une manière ou d'une autre. –

+0

C'est ce que je pensais aussi bien au début. Bien sûr, j'ai essayé cela avant de poster cette question. Il s'avère que si vous le définissez dans le gestionnaire d'événements 'wx.EVT_MOTION', il fonctionne _does_. –

+0

Vous n'avez pas personnalisé l'info-bulle, n'est-ce pas? Comment se fait-il qu'il y ait des coins arrondis et un fond noir? Ces paramètres système sont-ils utilisés par wxPython? Par hasard, j'ai découvert 'wx.PopupTransientWindow'. Je pourrais en afficher une instance qui ressemble à une info-bulle (comme dans la démo) sur la souris. Il peut être difficile de trouver le bon événement pour le tuer quand la souris n'est plus sur "l'image de déclenchement". –

2

Si vous créez un bouton avec un ID de wx.ID_HELP, vous obtiendrez le bouton d'aide en stock de la plate-forme, s'il en a un. Ensuite, vous pouvez faire ce que vous voulez avec n'importe quel bouton. Assignez une info-bulle, faites quelque chose dans l'événement EVT_BUTTON, etc. Voir le StockButtons sample in the demo. Si l'image de stock ou l'étiquette ne répond pas à vos besoins, vous pouvez probablement utiliser un wx.BitmapButton pour afficher l'image que vous voulez et avoir toujours la prise en charge de l'info-bulle standard.

Autre chose que vous voudrez peut-être examiner est le ContextHelp sample in the demo. Il montre comment utiliser un wx.ContextHelpButton qui, lorsqu'il est cliqué, met l'application en mode d'aide contextuelle. Une fenêtre d'info-bulle apparaîtra alors pour le widget suivant. Pas tout à fait ce que vous demandez, mais ce pourrait être un bon ajustement.

+0

Merci, j'ai ajouté des liens vers des échantillons, leur étude. En dehors de cela, même retour que pour @ rolf-of-saxony ... la sémantique UX d'un bouton ne correspond pas tout à fait au "survol de l'image". –

2

wxArtProvider peut être en mesure d'aider http://docs.wxwidgets.org/trunk/classwx_art_provider.html

import wx 
class Test(wx.Frame): 
    def __init__(self,parent,msg,title): 
     wx.Frame.__init__(self, None) 
     self.panel = wx.Panel(self, size=(300,400)) 
     mainSizer = wx.BoxSizer(wx.HORIZONTAL) 
     staticIcon = wx.BitmapButton(self.panel, bitmap=wx.ArtProvider.GetBitmap(wx.ART_WARNING), size=(32,32)) 
     mainSizer.Add(staticIcon, flag=wx.ALL, border=10) 
     ttip = "xxxxxxxxxxxxxxx\n" 
     ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxx\n" 
     ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxxx\n" 
     ttip += "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" 
     staticIcon.SetToolTipString(ttip) 
     buttonText = wx.StaticText(self.panel, -1, msg, wx.DefaultPosition, wx.DefaultSize, 0) 
     mainSizer.Add(buttonText, flag=wx.ALL, border=10) 
     staticIcon.Bind(wx.EVT_BUTTON, self.OnButton) 
     self.SetSizer(mainSizer) 
     self.Show() 

    def OnButton(self, evt): 
     print "The button was pressed - display some help" 

if __name__ == '__main__': 
    app = wx.App() 
    Test(None, "Dummy Exercise", "Test 123") 
    app.MainLoop() 

enter image description here

+0

Cela semble bien, merci. D'un point de vue UX, il devrait s'agir soit d'une info-bulle (c'est-à-dire d'un survol) sur une image, soit d'un bouton sur lequel l'utilisateur doit cliquer. –