Почему элемент MenuBar задерживается в wxPython в Windows, а мгновенный - в OS X? - PullRequest
1 голос
/ 20 августа 2011

Пожалуйста, обратитесь к урезанному примеру скрипта ниже.Когда я запускаю это в OS X, menubar ведет себя точно так, как вы ожидаете.В Windows, однако, есть заметное отставание (~ 4 с на моем 2 ГГц Core 2 Duo) рендеринга пункта меню «Медленный».Это не совсем правильно, если приложение показывает старое доброе предупреждение (Not Responding) - это не совсем то поведение, которое вы ожидаете после щелчка по меню.

Кто-нибудь сталкивался с этой проблемой?до?Я что-то не так делаю на стороне Windows?

Что касается версий, я протестировал как последнюю стабильную версию, 2.8.12.1, так и разработку, 2.9.2.1, и я использую 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()

1 Ответ

0 голосов
/ 24 августа 2011

Я позже разместил это в списке wxPython и получил этот ответ.Ничего плохого на самом деле, просто XP - это XP, и все.

...