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)
Danke, es funktioniert und ich habe eine MockMenu-Klasse für meinen Zweck hinzugefügt und hinzugefügt, um auch zu antworten. –