wxpython菜单的位置_wxPython菜单不显示图像

I am creating a menu and assigning images to menu items, sometime first item in menu doesn't display any image, I am not able to find the reason. I have tried to make a simple stand alone example and below is the code which does demonstrates the problem on my machine.

I am using windows XP, wx 2.8.7.1 (msw-unicode)'

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 are you able to see the problem and what could be the reason for it?

Conclusion: Yes this is a official bug, I have created a simple Menu class to overcome this bug, using the trick given by "balpha" in selected answer

It overrides each menu.Append method and sees if menu item with image is being added for first time, if yes creates a dummy item and deletes it later.

This also adds feature/constraint so that instead of calling SetBitmap, you should pass bitmap as optional argument image

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)

解决方案

This is a confirmed bug which appearently has been open for quite a while. After trying around a little bit, this workaround seems to do it:

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)

Note that the position of the fileMenu.Remove call is the earliest position that works, but you can also move it to the bottom. HTH.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值