2009-07-03 11 views
3

メニューを作成してメニュー項目に画像を割り当てていますが、メニューの最初の項目に画像が表示されない場合は、その理由を見つけることができません。私は単純なスタンドアロンの例を作成しようとしました、そして、以下は私のマシン上の問題を示すコードです。私は、WX 2.8.7.1(MSW-ユニコード)」ウィンドウズXPを使用しています wxPythonメニューに画像が表示されない

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() 

は、だから、問題を見ることができますし、何がその理由だろうか?

結論:はい、これは公式のバグです、私が選択した答え

に「balpha」によって与えられたトリックを使用して、このバグを克服するためのシンプルなメニュークラスを作成していることは、各menu.Appendメソッドをオーバーライドし、イメージ付きのメニューアイテムが最初に追加されているかどうかを確認します(yesの場合はダミーアイテムを作成し、後で削除します)。

また、これは代わりにSetBitmapを呼び出す、オプションの引数画像

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) 

答えて

2

としてビットマップを渡す必要がありますように、これはappearentlyかなり長い間オープンしていconfirmed bugある機能/制約を追加します。少し周りをしようとした後、この問題を回避するには、それを行うようだ:

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) 

注fileMenu.Removeコールの位置が働く早い位置ですが、あなたはまた、一番下に移動できること。 HTH。

+0

ありがとう、それは動作し、私の目的のためのMockMenuクラスを追加し、これを使用しても答えに追加されました。 –

4

このハックは、wx.MenuItem()で各メニュー項目を作成し、そのビットマップを設定してからそれをメニューに追加するだけでは必要ではないようです。これにより、ビットマップが正しく表示されます。私はWindows上でwxPython 2.8.10.1でテストしています。

関連する問題