書いているコードではcheckableなmenu itemの状態とwindowの有無が一致しないが、下のコードでは一致する。
正確にはdisableされた場合にenableされるまでに何かが起こらないと一致しないって現象なんだけどね。(child windowをdeleteするのにネットワークの切断を待つので)
う~~ん、でもこれって読むより書くほうが「楽」ということの証明でないか??!!
import wx
import wx.aui
class MainWindow(wx.aui.AuiMDIParentFrame):
def __init__(self):
wx.aui.AuiMDIParentFrame.__init__(self, None, -1,
"parent",
size=(400, 300),
style=wx.DEFAULT_FRAME_STYLE,
)
self.children = {'alpha':None, 'bravo':None, 'chalie':None}
self.SetMenuBar(self.make_menu_bar())
def UpdateMenubar(self):
self.SetMenuBar(self.make_menu_bar())
def make_menu_bar(self):
menuBar = wx.MenuBar()
menuItem = wx.Menu()
for name, window in self.children.items():
item = menuItem.AppendCheckItem(-1, name, '???')
item.Check(window is not None)
self.Bind(wx.EVT_MENU, self.OnToggle, item)
menuBar.Append(menuItem, 'Items')
return menuBar
def OnToggle(self, evt):
Id = evt.GetId()
item = self.GetMenuBar().FindItemById(Id)
check = item.IsChecked()# check is done by wx before we read value.
label = item.GetLabel().encode('us-ascii') #ugh!
if check:
self.CreateChild(label)
else:
self.DeleteChild(label)
def CreateChild(self, name):
cw = ChildWindow(self, name)
self.children.update({name:cw})
self.UpdateMenubar()
def DeleteChild(self, name):
cw = self.children[name]
self.children.update({name:None})
cw.Destroy()
self.UpdateMenubar()
class ChildWindow(wx.aui.AuiMDIChildFrame):
def __init__(self, parent, name):
wx.aui.AuiMDIChildFrame.__init__(self, parent, -1, name)
self.Bind(wx.EVT_ACTIVATE, self.OnActivate)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.name = name
def OnClose(self, evt):
p = self.GetMDIParent()
p.DeleteChild(self.name)
def OnActivate(self, evt):
self.UpdateMenubar()
def UpdateMenubar(self):
self.SetMenuBar(self.make_menu_bar())
def GetMDIParent(self):
return self.GetParent().GetParent()
def make_menu_bar(self):
parent = self.GetMDIParent()
mb = parent.make_menu_bar()
menuFile = wx.Menu()
menuFile.Append(-1, 'child menu', 'help!')
mb.Append(menuFile, self.GetTitle())
return mb
app = wx.PySimpleApp()
mdi_parent = MainWindow()
mdi_parent.Show()
0 件のコメント:
コメントを投稿