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
Post a Comment