Wxpython在菜单event.GetLabel()中加倍下划线字符

时间:2015-09-21 08:50:36

标签: python wxpython

我加载了一个菜单,其中包含用户可以从中选择的文件名 如果文件名包含下划线字符(_),则

event.GetEventObject().GetLabel(event.GetId())

返回一个值,其中任何下划线字符(_)加倍 因此,a_file.txt的文件名变为a__file.txt
我可以使用

解决问题

event.GetEventObject().MenuItems[event.GetId()].GetLabel()

但不仅我不知道是否有任何影响,但是 我并不特别想要浏览1000多行代码 对于这个奇怪的问题。
有没有人对这种行为有解释以及如何避免它?

下面的演示代码说明了问题和解决方法 测试用于普通文件名,带空格的文件名和文件名 用下划线。

import wx

class MenuProblem(wx.Frame):

    def __init__(self, *args, **kwds):
        self.frame=wx.Frame.__init__(self, *args, **kwds)
        self.menubar = wx.MenuBar()
#        self.statusbar = wx.StatusBar(self-1)
        self.CreateStatusBar()
        self.SetStatusText("Demonstration of wxPython")
        menu1 = wx.Menu()
        menu_item_1 = menu1.Append(wx.ID_OPEN, "&File")
        menu_item_2 = menu1.Append(wx.ID_EXIT, "&Exit...")

    #Build a list of things via another function or just a declaration
        self.list_of_things = ["afilename.txt", "another filename.txt", "problem_filename.txt"]
        list_used = wx.Menu()
        thing_count = 0

        for thing in self.list_of_things:
            t1 = wx.MenuItem(list_used, thing_count, thing)
            list_used.AppendItem(t1)
            thing_count +=1

        thing_end = wx.MenuItem(list_used,199,'End of List')
        list_used.AppendItem(thing_end)

        menu1.AppendMenu(wx.ID_FILE,'&Problem Demo',list_used)
        menu1.SetHelpString(wx.ID_FILE, 'Click problem_filename.txt to see the doubling of underscore')

        self.menubar.Append(menu1, "&File")
        self.SetMenuBar(self.menubar)
    # Create bindings for the Thing list
        i_count = 0
        for i in self.list_of_things:
            self.Bind(wx.EVT_MENU, self.OnThingOpen, id=i_count)
            i_count = i_count + 1
        self.Bind(wx.EVT_MENU, self.OnThingEnd, id=199)
        self.Bind(wx.EVT_MENU, self.OnClose, id=wx.ID_EXIT)
        self.Show(True)

    def OnThingOpen(self, event):
        id_selected = event.GetId()
        obj = event.GetEventObject()
        print "Option        :", id_selected
        print "Label returned:", obj.GetLabel(id_selected)
        print "Now get the label in another way"
        print "Label returned:", obj.MenuItems[id_selected].GetLabel()
        print "From the range:"
        for i in range(obj.MenuItemCount):
            print "\t\t", obj.MenuItems[i].GetLabel()
        print "."*50

    def OnThingEnd(self, event):
        id_selected = event.GetId()
        obj = event.GetEventObject()
        print "Option         :", id_selected
        print "Label returned :",obj.GetLabel(id_selected)
        print "Enabled", obj.IsEnabled(id_selected)
        print obj.MenuItemCount
        for i in range(obj.MenuItemCount):
            print obj.MenuItems[i].GetLabel()

    def OnClose(self, event):
        self.Close()

if __name__ == '__main__':
    app = wx.App()
    MC=MenuProblem(parent=None, id=-1)
    app.MainLoop()    

编辑:
看起来这是wxpython 2.8中的一个错误(在Linux上,可能是其他平台上),因为问题并没有在Windows上使用wxpython 3.0表现出来。信息由@pss提供,他为我测试了代码。
结果是我确实在我的代码中搜索并使用了上面详述的解决方法。

1 个答案:

答案 0 :(得分:0)

继我原来编辑问题之前,故障似乎是一个非常古老的问题,如trac.wxwidgets.org上的票号#338,#9062和#9055所讨论的那样,并且与下划线(_)字符有关被用作GTK +的转义字符。这种形式的错误也可能存在于Windows上,但Windows上的错误字符不是下划线而是&符号(&),即在Windows下,文件名如& filename.txt可以作为afilename.txt返回,因为它完全放弃&符号(我不是100%肯定这看到代码)
http://trac.wxwidgets.org/changeset/9055/svn-wx

因此,在Windows平台上测试@pss时,问题可能不是一个已修复的简单错误,而是wxpython / wxwidgets与正在使用的图形平台之间出现问题的结果。
如果您遇到这个问题,请在原始问题中详细说明并运行:

stack.yaml

或如代码块中所述,更加啰嗦:

event.GetEventObject().MenuItems[event.GetId()].GetLabel()