python - Hvorfor er MenuBar-elementet forsinket i wxPython i Windows, mens det er øjeblikkeligt i OS X?

Indlæg af Hanne Mølgaard Plasc

Problem



Se venligst afsnittet for fjernet eksempel nedenfor. Når jeg kører dette i OS X, fungerer menulinjen nøjagtigt som du forventer det. I Windows er der dog et mærkbart lag (~ 4s på min 2GHz Core 2 Duo) af gengivelsen af ​​menupunktet 'Slow'. Jeg føler mig ret overhovedet, at få en ansøgning til at vise den gode gamle (Not Responding) advarsel, er ikke den opførsel, du forventer, efter at du har klikket rundt i en menu.


Har nogen kørt ind i dette problem før? Gør jeg noget galt på Windows side?


Så vidt versioner går, testede jeg både med den seneste stabile, 2.8.12.1 og udvikling, 2.9.2.1, og jeg kører Python 2.7.


import wx
from operator import itemgetter
from itertools import groupby

class MainFrame(wx.Frame):
    def \_\_init\_\_(self):
        wx.Frame.\_\_init\_\_(self, None, title='Hello', size=(1150,700))
        self.panel = wx.Panel(self, -1)
        file\_menu = wx.Menu()
        open\_item = file\_menu.Append(-1, 'Open Something')
        self.slow\_menu = wx.Menu()
        another\_menu = wx.Menu()
        another\_item = another\_menu.Append(-1, 'Something')
        more\_menu = wx.Menu()
        more\_item = more\_menu.Append(-1, 'Else')
        self.menu\_bar = wx.MenuBar()
        self.menu\_bar.Append(file\_menu, 'File')
        self.menu\_bar.Append(self.slow\_menu, 'Slow')
        self.menu\_bar.Append(another\_menu, 'Fake')
        self.menu\_bar.Append(more\_menu, 'Hello')
        self.SetMenuBar(self.menu\_bar)
        self.setup\_slow\_menu()
        self.Bind(wx.EVT\_CLOSE, self.OnClose)
    def OnClose(self, event):
        self.Destroy()
    def OnDud(self, event):
        pass
    def setup\_slow\_menu(self):
        names = """
        James    Christopher    Ronald        Mary    Lisa    Michelle
        John     Daniel  Anthony         Patricia     Nancy   Laura
        Robert   Paul     Kevin       Linda   Karen   Sarah
        Michael  Mark     Jason       Barbara     Betty   Kimberly
        William  Donald   Jeff        Elizabeth   Helen   Deborah
        David    George   Jennifer    Sandra
        Richard  Kenneth Maria    Donna
        Charles  Steven  Susan    Carol
        Joseph   Edward  Margaret     Ruth
        Thomas   Brian   Dorothy      Sharon""".split()
        some\_data = ['red','blue','white','orange','brown']
        some\_more\_data = ['socks','pants','shirts','gloves','hats','red','blue','white','orange','brown']
        subs = ['Bla', 'Blabla']
        subsubs = []
        for name in names[:25]:
            subsubs.append((subs[0], name))
        for name in names[25:]:
            subsubs.append((subs[1], name))
        for sub in subs:
            sub\_menu = wx.Menu()
            self.slow\_menu.AppendMenu(-1, sub, sub\_menu)
            for sub, subsub in [r for r in subsubs if r[0]==sub]:
                subsub\_menu = wx.Menu()
                sub\_menu.AppendMenu(-1, subsub, subsub\_menu)
                for i in xrange(30):
                    subsubsub\_menu = wx.Menu()
                    subsub\_menu.AppendMenu(-1, str(i), subsubsub\_menu)
                    for label in some\_more\_data:
                        menu\_item = wx.MenuItem(subsubsub\_menu, id=wx.NewId(), text=label)
                        subsubsub\_menu.AppendItem(menu\_item)
                        self.Bind(wx.EVT\_MENU, self.OnDud, id=menu\_item.GetId())
                for label in some\_data:
                    menu\_item = wx.MenuItem(subsub\_menu, id=wx.NewId(), text=label)
                    subsub\_menu.AppendItem(menu\_item)
                    self.Bind(wx.EVT\_MENU, self.OnDud, id=menu\_item.GetId())
            for label in some\_data:
                menu\_item = wx.MenuItem(sub\_menu, id=wx.NewId(), text=label)
                sub\_menu.AppendItem(menu\_item)
                self.Bind(wx.EVT\_MENU, self.OnDud, id=menu\_item.GetId())
        for label in some\_data:
            menu\_item = wx.MenuItem(self.slow\_menu, id=wx.NewId(), text=label)
            self.slow\_menu.AppendItem(menu\_item)
            self.Bind(wx.EVT\_MENU, self.OnDud, id=menu\_item.GetId())

if \_\_name\_\_ == "\_\_main\_\_":
    app = wx.PySimpleApp()
    frame = MainFrame()
    frame.Show()
    app.MainLoop()

Bedste reference


Jeg bogførte dette på wxPython listen senere, og fik dette svar. Intet forkert virkelig, bare XP er XP, der er alt. [3]