2009-07-03 12 views
3

Ich erstelle ein Menü und Zuordnung von Bildern zu Menüpunkten, irgendwann erste Element im Menü zeigt kein Bild, ich bin nicht in der Lage, den Grund zu finden. Ich habe versucht, ein einfaches Stand-Alone-Beispiel zu machen, und unten ist der Code, der das Problem auf meiner Maschine demonstriert. ich Windows XP verwende, wx 2.8.7.1 (msw-Unicode)‘wxPython Menü zeigt nicht Bild

import wx 

def getBmp(): 
    bmp = wx.EmptyBitmap(16,16) 
    return bmp 

class MyFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, style=wx.DEFAULT_FRAME_STYLE, parent=None) 

     self.SetTitle("why New has no image?") 

     menuBar = wx.MenuBar() 
     fileMenu=wx.Menu() 
     item = fileMenu.Append(wx.ID_NEW, "New") 
     item.SetBitmap(getBmp()) 
     item = fileMenu.Append(wx.ID_OPEN, "Open") 
     item.SetBitmap(getBmp()) 
     item = fileMenu.Append(wx.ID_SAVE, "Save") 
     item.SetBitmap(getBmp()) 
     menuBar.Append(fileMenu, "File") 
     self.SetMenuBar(menuBar) 


app = wx.PySimpleApp() 
frame=MyFrame() 
frame.Show() 
app.SetTopWindow(frame) 
app.MainLoop() 

So sind Sie in der Lage, das Problem zu sehen und was der Grund dafür sein könnte?

Fazit: Ja, das einen offizieller Fehler ist, ich habe eine einfache Menü-Klasse erstellt, diesen Fehler zu überwinden, den Tricks von „balpha“

in ausgewählter Antwort gegeben Verwendung Sie überschreibt jede menu.Append Methode und sieht, ob ein Menüpunkt mit Bild zum ersten Mal hinzugefügt wird, wenn ja, erstellt ein Dummy-Objekt und löscht es später.

Dies fügt auch Funktion/Einschränkung, so dass anstelle SetBitmap der Aufruf, Sie Bitmap als optionales Argument Bild

import wx 

class MockMenu(wx.Menu): 
    """ 
    A custom menu class in which image param can be passed to each Append method 
    it also takes care of bug http://trac.wxwidgets.org/ticket/4011 
    """ 

    def __init__(self, *args, **kwargs): 
     wx.Menu.__init__(self, *args, **kwargs) 
     self._count = 0 

    def applyBmp(self, unboundMethod, *args, **kwargs): 
     """ 
     there is a bug in wxPython so that it will not display first item bitmap 
     http://trac.wxwidgets.org/ticket/4011 
     so we keep track and add a dummy before it and delete it after words 
     may not work if menu has only one item 
     """ 

     bmp = None 
     if 'image' in kwargs: 
      bmp = kwargs['image'] 

     tempitem = None 
     # add temp item so it is first item with bmp 
     if bmp and self._count == 1: 
      tempitem = wx.Menu.Append(self, -1,"HACK") 
      tempitem.SetBitmap(bmp) 

     ret = unboundMethod(self, *args, **kwargs) 
     if bmp: 
      ret.SetBitmap(bmp) 

     # delete temp item 
     if tempitem is not None: 
      self.Remove(tempitem.GetId()) 

     self._lastRet = ret 
     return ret 

    def Append(self, *args, **kwargs): 
     return self.applyBmp(wx.Menu.Append, *args, **kwargs) 

    def AppendCheckItem(self, *args, **kwargs): 
     return self.applyBmp(wx.Menu.AppendCheckItem, *args, **kwargs) 

    def AppendMenu(self, *args, **kwargs): 
     return self.applyBmp(wx.Menu.AppendMenu, *args, **kwargs) 

Antwort

2

Dies ist ein confirmed bug die appearently offen war für eine ganze Weile vergehen soll. um ein wenig nach dem Versuch, scheint diese Abhilfe, es zu tun:

menuBar = wx.MenuBar() 
    fileMenu=wx.Menu() 
    tempitem = fileMenu.Append(-1,"X")  # !!! 
    tempitem.SetBitmap(getBmp())    # !!! 
    item = fileMenu.Append(wx.ID_NEW, "New") 
    fileMenu.Remove(tempitem.GetId())  # !!! 
    item.SetBitmap(getBmp()) 
    item = fileMenu.Append(wx.ID_OPEN, "Open") 
    item.SetBitmap(getBmp()) 
    item = fileMenu.Append(wx.ID_SAVE, "Save") 
    item.SetBitmap(getBmp()) 
    menuBar.Append(fileMenu, "File") 
    self.SetMenuBar(menuBar) 

Beachten Sie, dass die Position des fileMenu.Remove Aufruf der früheste Position ist, die funktioniert, aber man kann es auch nach unten bewegen. HTH.

+0

Danke, es funktioniert und ich habe eine MockMenu-Klasse für meinen Zweck hinzugefügt und hinzugefügt, um auch zu antworten. –

4

Dieser Hack scheint nicht notwendig zu sein, wenn Sie jedes Menüelement mit wx.MenuItem() erstellen, seine Bitmap festlegen und erst dann an das Menü anhängen. Dies führt dazu, dass die Bitmaps korrekt angezeigt werden. Ich teste mit WxPython 2.8.10.1 unter Windows.