DevPlayer

Positioning Buttons with sizers

Feb 5th, 2016
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.00 KB | None | 0 0
  1.  
  2.  
  3. # google groups: wxpython-users
  4. # topic replied to: Curious why this alignment has to be set up this way
  5.  
  6. # http://www.blog.pythonlibrary.org/2011/01/04/wxpython-wx-listctrl-tips-and-tricks/
  7.  
  8. import wx
  9.  
  10. # you could use collections.OrderedDict
  11. data = {
  12.     # map
  13.     # sort_key, count, greek
  14.     5:('one', 'alpha'),
  15.     6:('two', 'beta'),
  16.     7:('three', 'gamma'),
  17.     8:('four', 'delta'), }
  18.  
  19.  
  20. class MainPanel(wx.Panel):
  21.  
  22.     __doc__ = wx.Panel.__doc__
  23.  
  24.     # Panel(parent, id=ID_ANY, pos=DefaultPosition, size=DefaultSize, style=TAB_TRAVERSAL, name=PanelNameStr)
  25.     def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL, name='MainPanel'):
  26.         #wx.Panel.__init__(self, parent, id, pos, size, style, name)
  27.         super().__init__(parent, id, pos, size, style, name)
  28.  
  29.         # Add three buttons
  30.         # Button(parent, id=ID_ANY, label=EmptyString, pos=DefaultPosition, size=DefaultSize, style=0, validator=DefaultValidator, name=ButtonNameStr)
  31.         ok = wx.Button(self, id=wx.ID_OK, name='ok')
  32.         cancel = wx.Button(self, id=wx.ID_CANCEL, name='cancel')
  33.         exitb = wx.Button(self, id=wx.ID_EXIT, name='exit')
  34.  
  35.         # Put three buttons into a BoxSizer
  36.         hsizer = wx.BoxSizer(wx.HORIZONTAL)
  37.         hsizer.Add(ok, 0, wx.ALIGN_RIGHT | wx.EXPAND | wx.ALL, 5)
  38.         hsizer.Add(cancel, 0, wx.ALIGN_RIGHT | wx.EXPAND | wx.ALL, 5)
  39.         hsizer.Add(exitb, 0, wx.ALIGN_RIGHT | wx.EXPAND | wx.ALL, 5)
  40.  
  41.         # ListCtrl(parent, id=ID_ANY, pos=DefaultPosition, size=DefaultSize, style=LC_ICON, validator=DefaultValidator, name=ListCtrlNameStr)
  42.         self.lb = wx.ListCtrl(self, style = wx.LC_REPORT | wx.BORDER_SUNKEN | wx.LC_SINGLE_SEL, name='mylist')
  43.         self.lb.InsertColumn(0, 'Count')
  44.         self.lb.InsertColumn(1, 'Greek')
  45.  
  46.         # Fill the ListCtrl
  47.         self.fillListCtrl()
  48.  
  49.         # Layout buttons and ListCtrl
  50.         vsizer = wx.BoxSizer(wx.VERTICAL)
  51.         vsizer.Add(hsizer, 0, wx.ALIGN_RIGHT | wx.ALL, 0)
  52.         vsizer.Add(self.lb, 1, wx.EXPAND | wx.ALL, 5)
  53.  
  54.         self.SetSizer(vsizer)
  55.  
  56.         self.setListCtrlColumnWidths()
  57.  
  58.         # Event Bindings
  59.         self.Bind(wx.EVT_SIZE, self.onSize)
  60.         self.Bind(wx.EVT_BUTTON, self.onButton)
  61.         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onItemSelected)
  62.  
  63.  
  64.     def fillListCtrl(self, start=0, end=None):
  65.  
  66.         """NotImplemented start and end"""
  67.  
  68.         self.lb.DeleteAllItems()
  69.         index = 0
  70.         for key in sorted(data):
  71.             label = data[key][0]
  72.             greek = data[key][1]
  73.             item = self.lb.InsertItem(index, label)
  74.             self.lb.SetItem(index, 1, greek)
  75.  
  76.             # optional for sorting
  77.             self.lb.SetItemData(index, key)
  78.             index += 1
  79.  
  80.  
  81.     def setListCtrlColumnWidths(self):
  82.  
  83.         """Set the listctrl column zero's width to the remaining
  84.        width after column one's usage. Magic number 5 removed from
  85.        width to prevent horizontal scrollbar."""
  86.  
  87.         second_column_width = self.lb.GetColumnWidth(1)
  88.         first_column_width = self.lb.GetSize()[0]-5-second_column_width
  89.         self.lb.SetColumnWidth(0, first_column_width)
  90.  
  91.  
  92.     def SetStatusText(self, text='', number=0):
  93.         top_parent = self.GetTopLevelParent()
  94.         if top_parent.GetStatusBar():
  95.             top_parent.SetStatusText(text, number)
  96.  
  97.  
  98.     def onItemSelected(self, event):
  99.         index = event.GetIndex()
  100.         key = event.GetData()
  101.         label = event.GetLabel()
  102.  
  103.        
  104.         column_1_text = data[key][1]
  105.         # OR
  106.         column_1_item  = self.lb.GetItem(index, 1)
  107.         column_1_text = column_1_item.GetText()
  108.  
  109.         text = "index:{} sort_key:{} count:{} greek:{}".format(
  110.             index, key, label, column_1_text)
  111.         self.SetStatusText(text)
  112.        
  113.  
  114.     def onSize(self, event):
  115.  
  116.         """If you like column zero of the listctrl to expand
  117.        instead of the last column."""
  118.  
  119.         self.setListCtrlColumnWidths()
  120.         event.Skip() # needed in this case
  121.  
  122.  
  123.     def onButton(self, event):
  124.         widget = event.GetEventObject()
  125.         name = widget.GetName()
  126.         self.SetStatusText(name + ' clicked')
  127.  
  128.  
  129. class MainFrame(wx.Frame):
  130.  
  131.     __doc__ = wx.Frame.__doc__
  132.  
  133.     # Frame(parent, id=ID_ANY, title=EmptyString, pos=DefaultPosition, size=DefaultSize, style=DEFAULT_FRAME_STYLE, name=FrameNameStr)
  134.     def __init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name='MainFrame'):
  135.  
  136.         #wx.Panel.__init__(self, parent, id, pos, size, style, name)
  137.         super().__init__(parent, id, title, pos, size, style, name)
  138.  
  139.         sizer = wx.BoxSizer(wx.VERTICAL)
  140.         sizer.Add(MainPanel(self), 1, wx.EXPAND | wx.ALL, 0)
  141.         self.SetSizer(sizer)
  142.         self.CreateStatusBar()
  143.         self.Show()
  144.  
  145.  
  146. if __name__ == "__main__":
  147.     app = wx.App()
  148.     frame = MainFrame(None, title='BoxSizer options')
  149.     app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment