[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