[wxPython-users] My wxBoxList is too high (my own menu
implementation) - example included
Wojtek P
wojtulek at gmail.com
Mon Sep 3 08:03:53 PDT 2007
Thanks Robin!
:)
I change code - maybe this best solution (?) in this case:
################################## E X A M P L E
import wx
# my menu control implementation
###########################################################################=
####
class MyMenu(wx.Dialog):
###########################################################################=
####
def __init__(self, parent, choices=3DNone):
wx.Dialog.__init__(self, parent, -1, style =3D wx.NO_3D)
self.list =3D wx.ListBox(self, -1, style=3Dwx.NO_BORDER)
self.list.Bind(wx.EVT_LISTBOX, self.OnListSelect)
self.list.Bind(wx.EVT_KEY_DOWN, self.OnListKeyDown)
self.list.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
self.list.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
self.list.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
self.list.Bind(wx.EVT_CLOSE, self.OnClose)
self.list.SetBackgroundColour(wx.BLUE)
self.list.SetForegroundColour(wx.WHITE)
self.SetChoices(choices)
self.mainSizer =3D wx.BoxSizer(wx.VERTICAL)
self.mainSizer.Add(self.list, 1, wx.EXPAND|wx.ALL, 1)
self.SetSizer(self.mainSizer)
self.mouseSel =3D True
def Popup(self, pos):
self.SetPosition(pos)
self.list.CaptureMouse()
self.Fit()
return self.ShowModal()
def OnKillFocus(self, event):
event.Skip()
if self.list.HasCapture():
self.list.ReleaseMouse()
def OnSetFocus(self, event):
event.Skip()
if not self.list.HasCapture():
self.list.CaptureMouse()
def OnMouse(self, event):
event.Skip()
if event.LeftDown():
pos =3D event.GetPosition()
rct =3D self.list.GetRect()
if not rct.Inside(pos):
event.Skip(False)
self.Close()
#else:
# wheel_rot =3D event.GetWheelRotation()
# if wheel_rot>0:
# self.SetSelection(self.GetSelection()-1)
# elif wheel_rot<0:
# self.SetSelection(self.GetSelection()+1)
def OnClose(self, event):
if self.list.HasCapture():
self.list.ReleaseMouse()
event.Skip(False)
def SetChoices(self, choices):
self.list.Clear()
for item1 in choices:
self.list.Append(item1)
self.list.SetBestFittingSize((-1, self.GetBestHeight()))
def GetSelString(self):
sel_indx =3D self.list.GetSelection()
return self.list.GetString(sel_indx)
def GetString(self, index):
return self.list.GetString(index)
def SetSelection(self, index):
if index<0 or index>=3Dself.list.GetCount():
return
self.list.SetSelection(index)
def GetSelection(self):
return self.list.GetSelection()
def OnListSelect(self, event):
if self.mouseSel:
event.Skip(False)
self.Close()
self.SetReturnCode(wx.ID_OK)
self.mouseSel =3D True
def GetBestHeight(self):
return (self.list.GetCharHeight())*self.list.GetCount()
def GetCount(self):
return self.list.GetCount()
def OnListKeyDown(self, event):
event.Skip()
key_code =3D event.m_keyCode
if key_code in (wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER):
self.Close()
self.SetReturnCode(wx.ID_OK)
elif key_code =3D=3D wx.WXK_ESCAPE:
self.Close()
self.SetReturnCode(wx.ID_CANCEL)
elif key_code in (wx.WXK_DOWN, wx.WXK_UP, wx.WXK_HOME, wx.WXK_END):
self.mouseSel =3D False
###########################################################################=
####
###########################################################################=
####
# test APP
ID_B1 =3D wx.NewId()
ID_B2 =3D wx.NewId()
ID_B3 =3D wx.NewId()
class TestDialog(wx.Dialog):
def __init__(self):
wx.Dialog.__init__(self, None, -1, "Test dialog", style=3D
wx.DEFAULT_DIALOG_STYLE)
mainSizer =3D wx.BoxSizer(wx.HORIZONTAL)
b1 =3D wx.Button(self, ID_B1, "Menu1")
b2 =3D wx.Button(self, ID_B2, "Menu2")
b3 =3D wx.Button(self, ID_B3, "Menu3")
self.selTab =3D [0,0,0]
mainSizer.Add(b1, 0, wx.ALL, 20)
mainSizer.Add(b2, 0, wx.ALL, 20)
mainSizer.Add(b3, 0, wx.ALL, 20)
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_BUTTON, self.OnBtn)
self.SetSizer(mainSizer)
self.Fit()
def OnBtn(self, event):
btn_id =3D event.GetEventObject().GetId()
btn_indx =3D btn_id - ID_B1
menu =3D None
if btn_id =3D=3D ID_B1:
menu =3D MyMenu(self, ["Item #11", "Item #12", "Item #13"])
elif btn_id =3D=3D ID_B2:
menu =3D MyMenu(self, ["Item #21", "Item #22", "Item #23", "Item #24",
"Item #25", "Item #26", "Item #27"])
elif btn_id =3D=3D ID_B3:
menu =3D MyMenu(self, ["Item #31", "Item #32", "Item #33", "Item #34",
"Item #35", "Item #36", "Item #37","Item #38", "Item #39", "Item #31+",
"Item #32+", "Item #33+", "Item #34+", "Item #35+", "Item #36+", "Item
#37+", "Item #38+", "Item #39+"])
if menu:
menu.SetSelection(self.selTab[btn_indx])
but_pos =3D self.ClientToScreen(event.GetEventObject().GetPosition())
mr =3D menu.Popup(but_pos)
if(mr=3D=3Dwx.ID_OK):
sel_indx =3D menu.GetSelection()
event.GetEventObject().SetLabel(menu.GetString(sel_indx))
self.selTab[btn_indx] =3D sel_indx
menu.Destroy()
def OnClose(self, event):
self.Destroy()
if __name__ =3D=3D '__main__':
class MyApp(wx.App):
def OnInit(self):
wx.InitAllImageHandlers()
dlg =3D TestDialog()
dlg.Centre();
dlg.Show(True);
self.SetTopWindow(dlg);
return True
app =3D MyApp(False)
app.MainLoop()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.wxwidgets.org/pipermail/wxpython-users/attachments/200709=
03/2b045aba/attachment.htm
More information about the wxpython-users
mailing list