Saturday, 15 January 2011

Python/wxPython: Importing CSV file onto wxGrid not displaying to fit on frame -



Python/wxPython: Importing CSV file onto wxGrid not displaying to fit on frame -

am working on project have import csv files wx.grid farther manipulations. have searched , found useful way here http://wxpython-users.1045709.n5.nabble.com/new-to-the-list-opening-a-text-file-in-a-grid-using-splitterwindows-td2373808.html

now csv never seems display on screen frame @ (as per code below)? way around this?

csv1.py gui

class myframe3 ( wx.frame ): def __init__( self, parent ): wx.frame.__init__ ( self, parent, id = wx.id_any, title = wx.emptystring, pos = wx.defaultposition, size = wx.size( 900,600 ), style = wx.caption|wx.close_box|wx.minimize_box|wx.system_menu|wx.tab_traversal ) self.setsizehintssz( wx.defaultsize, wx.defaultsize ) sizer1 = wx.boxsizer( wx.horizontal ) sizer1.setminsize( wx.size( 0,0 ) ) self.right_panel = wx.panel( self, wx.id_any, wx.defaultposition, wx.defaultsize, wx.tab_traversal ) rightsizer = wx.boxsizer( wx.vertical ) self.right_panel.setsizer( rightsizer ) self.right_panel.layout() rightsizer.fit( self.right_panel ) sizer1.add( self.right_panel, 1, wx.expand |wx.all, 5 ) self.left_panel = wx.panel( self, wx.id_any, wx.defaultposition, wx.defaultsize, wx.tab_traversal ) leftsizer = wx.boxsizer( wx.vertical ) self.importbutton = wx.button( self.left_panel, wx.id_any, u"import csv file", wx.defaultposition, wx.defaultsize, 0 ) leftsizer.add( self.importbutton, 0, wx.all, 5 ) self.left_panel.setsizer( leftsizer ) self.left_panel.layout() leftsizer.fit( self.left_panel ) sizer1.add( self.left_panel, 0, wx.expand |wx.all, 5 ) self.setsizer( sizer1 ) self.layout() self.menubar = wx.menubar( 0 ) self.filemenu = wx.menu() self.importmenu = wx.menuitem( self.filemenu, wx.id_any, u"import", wx.emptystring, wx.item_normal ) self.filemenu.appenditem( self.importmenu ) self.menubar.append( self.filemenu, u"&file" ) self.setmenubar( self.menubar ) self.centre( wx.both ) # connect events self.importbutton.bind( wx.evt_button, self.importfunc ) self.bind( wx.evt_menu, self.importfunc, id = self.importmenu.getid() ) class csv_view(wx.app): def oninit(self): self.frame=myframe3(none, -1, 'pystereo', size=(900,600)) self.settopwindow(self.frame) homecoming true

csv2.py running script

#!/usr/bin/python # -*- coding: utf-8 -*- import wx import os import numpy np import sys, csv import wx.grid csv1 import myframe3, csv_view class myframe(myframe3): def __init__(self, parent, size = wx.size(900,600)): myframe3.__init__ (self, parent) self.dirname = os.getcwd() # import/open csv def importfunc( self, event ): '''this imported csv never expand fit frame, please help?''' dlg=wx.filedialog(self, 'choose file', self.dirname, '','csv files (*.csv)|*.csv|all files(*.*)|*.*',wx.open) if dlg.showmodal() == wx.id_ok: self.dirname=dlg.getdirectory() self.filename=os.path.join(self.dirname,dlg.getfilename()) self.file=file(self.filename, 'r') #check file format sniffer dialect = csv.sniffer().sniff(self.file.read(1024)) self.file.seek(0) csvfile=csv.reader(self.file,dialect) filedata = [] #put contents of csvfile list filedata.extend(csvfile) self.file.seek(0) #grab sample , see if there header sample=self.file.read(2048) self.file.seek(0) if csv.sniffer().has_header(sample): #if there header colnames=csvfile.next() # label columns first line datalist=[] # create list without header datalist.extend(filedata[1:len(filedata)]) #append info without header else: row1=csvfile.next() #if there no header colnames=[] in range(len(row1)): colnames.append('col_%d' % i) # label columns col_1, col_2, etc self.file.seek(0) datalist=filedata #append info datalist self.file.close() self.creategrid(datalist, colnames) #create grid def creategrid(self, datalist, colnames): if getattr(self, 'grid', 0): self.grid.destroy() self.grid=wx.grid.grid(self, 0) self.grid.creategrid(len(datalist), len(colnames)) #create grid, same size file (rows, cols) #fill in headings in range(len(colnames)): self.grid.setcollabelvalue(i, colnames[i]) #populate grid row in range(len(datalist)): col in range(len(colnames)): try: self.grid.setcellvalue(row,col,datalist[row][col]) except: pass self.grid.autosizecolumns(false) # size columns info (from cvsomatic.py) self.twiddle() def twiddle(self): # http://www.velocityreviews.com/forums/t330788-how-to-update-window-after-wxgrid-is-updated.html x,y = self.getsize() self.setsize((x, y+1)) self.setsize((x,y)) def exit(self, event): if getattr(self, 'file',0): self.file.close() self.close(true) # class csv_view(wx.app): # def oninit(self): # self.frame=myframe(none, -1, 'show csv', size=(900,600)) # self.settopwindow(self.frame) # homecoming true # app=csv_view() # app.mainloop() app = wx.app(0) frame_02 = myframe(none) frame_02.show() app.mainloop()

thanks help in advance.

the biggest issue have parenting problem. when create grid widget, add together frame, not sizer. causes grid initialized little size , gets stacked on top of panel. prepare this, need set parent of grid 1 of panels, add together grid sizer , phone call layout on panel. here's updated code csv2.py:

import wx import os import sys, csv import wx.grid csv1 import myframe3 class myframe(myframe3): def __init__(self, parent, size = wx.size(900,600)): myframe3.__init__ (self, parent) self.dirname = os.getcwd() # import/open csv def importfunc( self, event ): '''this imported csv never expand fit frame, please help?''' dlg=wx.filedialog(self, 'choose file', self.dirname, '','csv files (*.csv)|*.csv|all files(*.*)|*.*',wx.open) if dlg.showmodal() == wx.id_ok: self.dirname=dlg.getdirectory() self.filename=os.path.join(self.dirname,dlg.getfilename()) self.file=file(self.filename, 'r') #check file format sniffer dialect = csv.sniffer().sniff(self.file.read(1024)) self.file.seek(0) csvfile=csv.reader(self.file,dialect) filedata = [] #put contents of csvfile list filedata.extend(csvfile) self.file.seek(0) #grab sample , see if there header sample=self.file.read(2048) self.file.seek(0) if csv.sniffer().has_header(sample): #if there header colnames=csvfile.next() # label columns first line datalist=[] # create list without header datalist.extend(filedata[1:len(filedata)]) #append info without header else: row1=csvfile.next() #if there no header colnames=[] in range(len(row1)): colnames.append('col_%d' % i) # label columns col_1, col_2, etc self.file.seek(0) datalist=filedata #append info datalist self.file.close() self.creategrid(datalist, colnames) grid_sizer = wx.boxsizer(wx.vertical) grid_sizer.add(self.grid, 1, wx.expand) self.right_panel.setsizer(grid_sizer) self.right_panel.layout() #create grid def creategrid(self, datalist, colnames): if getattr(self, 'grid', 0): self.grid.destroy() self.grid=wx.grid.grid(self.right_panel, 0) self.grid.creategrid(len(datalist), len(colnames)) #create grid, same size file (rows, cols) #fill in headings in range(len(colnames)): self.grid.setcollabelvalue(i, colnames[i]) #populate grid row in range(len(datalist)): col in range(len(colnames)): try: self.grid.setcellvalue(row,col,datalist[row][col]) except: pass self.grid.autosizecolumns(false) # size columns info (from cvsomatic.py) self.twiddle() def twiddle(self): # http://www.velocityreviews.com/forums/t330788-how-to-update-window-after-wxgrid-is-updated.html x,y = self.getsize() self.setsize((x, y+1)) self.setsize((x,y)) def exit(self, event): if getattr(self, 'file',0): self.file.close() self.close(true) import wx.lib.mixins.inspection app = wx.app(0) frame_02 = myframe(none) frame_02.show() wx.lib.inspection.inspectiontool().show() app.mainloop()

i added widget inspection tool code help me figure out how panels laid out , set grid. useful figuring out problems widget layout. can read more handy tool on wxpython wiki:

http://wiki.wxpython.org/widget%20inspection%20tool

python csv wxpython

1 comment:

  1. Why you people copying other sites data and placing in your sites...there is no use of it

    ReplyDelete