user interface - Powerful table widget for a Python GUI -


i'd program table-like gui. know powerful table widget (for gui), has ready-made functionality filtering, sorting, editing , alike (as seen in excel)?

you can use wxgrid - here's demo code - need manage/wire events on underlying table. bit complicated gove explaination in words, here's code (mostly based on wx examples code):

import wx wx import evt_menu, evt_close import wx.grid gridlib  statusclient import jobdatatable, jobdatagrid   app = wx.app()   log = logger(__name__)   class jobmanager(wx.frame):      def __init__(self, parent, title):         super(jobmanager, self).__init__(parent, title=title)         panel = wx.panel(self, -1)          self.client_id = job_server.register()         log.info('registered server {}'.format(self.client_id))         self.jobs = job_server.get_all_jobs()         grid = self.create_grid(panel, self.jobs)                sizer = wx.boxsizer(wx.vertical)         sizer.add(grid, 1, wx.all|wx.expand)         panel.setsizer(sizer)          # bind close event         evt_close(self, self.exit)         self.center()         self.show()      def exit(self, event):         log.info('unregistering {0} server...'.format(self.client_id))         job_server.unregister(self.client_id)         job_server.close()         exit()      def create_grid(self, panel, data):         table = jobdatatable(jobs=data)         grid = jobdatagrid(panel)         grid.creategrid(len(data), len(data[0].keys()))         grid.settable(table)         grid.autosize()         grid.autosizecolumns(true)         return grid  def main():     frame = jobmanager(none, 'larskhill job manager')     app.mainloop()  if __name__ == '__main__':         job_server = zerorpc.client()         job_server.connect('tcp://0.0.0.0:4242')     main()   #### ui/client.py ####  import wx import wx.grid gridlib  even_row_colour = '#cce6ff' grid_line_colour = '#ccc' columns = {0:('id', 'id'), 1:('name', 'name'), 2:('created_at', 'created'), 3:('status', 'current status')}  log = logger(__name__)  class jobdatatable(gridlib.pygridtablebase):      """     custom wxgrid table expects user supplied data source.     """     def __init__(self, jobs=none):         gridlib.pygridtablebase.__init__(self)         self.headerrows = 0         self.jobs = jobs  #------------------------------------------------------------------------------- # required methods wxpygridtablebase interface #-------------------------------------------------------------------------------      def getnumberrows(self):         return len(self.jobs)      def getnumbercols(self):         return len(columns.keys())      #---------------------------------------------------------------------------     # get/set values in table.  python version of these     # methods can handle data-type, (as long editor ,     # renderer understands type too,) not strings in     # c++ version. load thises directly jobs data.     #---------------------------------------------------------------------------     def getvalue(self, row, col):         prop, label = columns.get(col)         #log.debug('setting cell value')         return self.jobs[row][prop]      def setvalue(self, row, col, value):         pass      #---------------------------------------------------------------------------     # optional methods     # called when grid needs display labels     #---------------------------------------------------------------------------     def getcollabelvalue(self, col):         prop, label = columns.get(col)         return label      #---------------------------------------------------------------------------     # called determine kind of editor/renderer use     # default, doesn't have same type used     # natively editor/renderer if know how convert.     #---------------------------------------------------------------------------     def gettypename(self, row, col):         return gridlib.grid_value_string      #---------------------------------------------------------------------------`     # called determine how data can fetched , stored     # editor , renderer.  allows enforce type-safety     # in grid.     #---------------------------------------------------------------------------     def cangetvalueas(self, row, col, typename):         pass      def cansetvalueas(self, row, col, typename):         pass      #---------------------------------------------------------------------------     # style table, stripy rows , highlight changed rows.     #---------------------------------------------------------------------------     def getattr(self, row, col, prop):         attr = gridlib.gridcellattr()          # odd rows         if row % 2 == 1:             bg_colour = even_row_colour             attr.setbackgroundcolour(bg_colour)          return attr  #------------------------------------------------------------------------------- # custom job grid #------------------------------------------------------------------------------- class jobdatagrid(gridlib.grid):     def __init__(self, parent, size=wx.size(1000, 500), data_table=none):         self.parent = parent         gridlib.grid.__init__(self, self.parent, -1) # grid references weak reference parent         self.setgridlinecolour(grid_line_colour)         self.setrowlabelsize(0)         self.setcollabelsize(30)         self.table = jobdatatable() 

give me shout if needs clarification.


Comments

Popular posts from this blog

django - How can I change user group without delete record -

java - Need to add SOAP security token -

java - EclipseLink JPA Object is not a known entity type -