Package tkintertable :: Module Tables_IO
[hide private]
[frames] | no frames]

Source Code for Module tkintertable.Tables_IO

  1  #!/usr/bin/env python 
  2  """ 
  3      Import and export classes. 
  4      Created Oct 2008 
  5      Copyright (C) Damien Farrell 
  6   
  7      This program is free software; you can redistribute it and/or 
  8      modify it under the terms of the GNU General Public License 
  9      as published by the Free Software Foundation; either version 2 
 10      of the License, or (at your option) any later version. 
 11   
 12      This program is distributed in the hope that it will be useful, 
 13      but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15      GNU General Public License for more details. 
 16   
 17      You should have received a copy of the GNU General Public License 
 18      along with this program; if not, write to the Free Software 
 19      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 20  """ 
 21   
 22  from Tkinter import * 
 23  import Pmw 
 24  import os, csv 
 25  import tkFileDialog 
 26   
27 -class TableImporter:
28 """Provides import utility methods for the Table and Table Model classes""" 29
30 - def __init__(self):
31 """Setup globals""" 32 #self.separator = ',' 33 self.separator_list = {',':',',' ':'space','\t':'tab','blank':' ',':':':'} 34 self.var_sep = StringVar() 35 self.var_sep.set(',') 36 return
37
38 - def import_Dialog(self, parent):
39 """Allows user to set some import options""" 40 self.parent=parent 41 self.master=Toplevel() 42 self.master.title("Import Data") 43 self.xsize = 450 44 self.ysize = 370 45 top=self.master.winfo_toplevel() 46 rootx=top.winfo_rootx() 47 rooty=top.winfo_rooty() 48 49 self.sep_choice = Pmw.OptionMenu( 50 parent = self.master,labelpos = 'w', 51 label_text = 'Record separator:', 52 menubutton_textvariable = self.var_sep, 53 items = self.separator_list.keys(), 54 initialitem = ',', 55 menubutton_width = 4, 56 command= self.update_display) 57 58 self.sep_choice.grid(row=0,column=0,sticky='nw',padx=2,pady=2) 59 #place for text preview frame 60 61 self.textframe=Pmw.ScrolledFrame(self.master, 62 labelpos = 'n', label_text = 'Preview', 63 usehullsize = 1, 64 hull_width = 450, 65 hull_height = 300) 66 self.textframe.grid(row=1,column=0,columnspan=5,sticky='news',padx=2,pady=2) 67 self.previewarea = Text(self.textframe.interior(), bg='white', width=400, height=500) 68 self.previewarea.pack(fill=BOTH, expand=1) 69 #buttons 70 self.openButton = Button(self.master, text = 'Open File', 71 command = self.do_openFile ) 72 self.openButton.grid(row=3,column=0,sticky='news',padx=2,pady=2) 73 self.importButton = Button(self.master, text = 'Do Import', 74 command = self.do_ModelImport ) 75 self.importButton.grid(row=3,column=1,sticky='news',padx=2,pady=2) 76 self.CancelButton = Button(self.master, text = 'Cancel', 77 command = self.close ) 78 self.CancelButton.grid(row=3,column=2,sticky='news',padx=2,pady=2) 79 self.master.columnconfigure(0,weight=1) 80 self.master.rowconfigure(1,weight=1) 81 return self.master
82
83 - def do_openFile(self):
84 self.datafile = self.open_File(self.parent) 85 self.update_display() 86 return
87
88 - def open_File(self, parent):
89 90 savedir = os.getcwd() 91 filename=tkFileDialog.askopenfile(defaultextension='.csv', 92 initialdir=savedir, 93 initialfile='', 94 filetypes=[("Data file","*.csv"), 95 ("All files","*.*")], 96 title='Choose data from a .csv file saved as excel spreadsheet in .csv format (comma separated list)', 97 parent=parent) 98 if filename and os.path.exists(filename.name) and os.path.isfile(filename.name): 99 datafile = filename.name 100 return datafile
101
102 - def update_display(self,evt=None):
103 """Preview loaded file""" 104 sep = self.var_sep.get() 105 self.previewarea.delete(1.0, END) 106 reader = csv.reader(open(self.datafile, "rb"), delimiter=sep) 107 for row in reader: 108 self.previewarea.insert(END,row) 109 self.previewarea.insert(END,'\n') 110 return
111
112 - def do_ModelImport(self):
113 """imports and places the result in self.modeldata""" 114 self.data = self.ImportTableModel(self.datafile) 115 self.close() 116 return
117
118 - def ImportTableModel(self,filename):
119 """Import table data from a comma separated file and create data for a model 120 This is reusable outside the GUI dialog also.""" 121 122 if not os.path.isfile(filename): 123 return None 124 try: 125 sep = self.var_sep.get() 126 except: 127 sep = ',' 128 #takes first row as field names 129 dictreader = csv.DictReader(open(filename, "rb"), delimiter=sep) 130 dictdata = {} 131 count=0 132 for rec in dictreader: 133 dictdata[count]=rec 134 count=count+1 135 return dictdata
136
137 - def close(self):
138 self.master.destroy() 139 return
140
141 -class TableExporter:
142 - def __init__(self):
143 """Provides export utility methods for the Table and Table Model classes""" 144 145 return
146
147 - def ExportTableData(self, table, sep=None):
148 """Export table data to a comma separated file""" 149 150 parent=table.parentframe 151 import tkFileDialog 152 filename = tkFileDialog.asksaveasfilename(parent=parent,defaultextension='.csv', 153 filetypes=[("CSV files","*.csv")] 154 ) 155 if not filename: 156 return 157 if sep == None: 158 sep = ',' 159 writer = csv.writer(file(filename, "w"), delimiter=sep) 160 #writer = csv.writer(sys.stdout, delimiter=sep) 161 model=table.getModel() 162 recs = model.getAllCells() 163 #take column labels as field names 164 colnames = model.columnNames 165 collabels = model.columnlabels 166 row=[] 167 for c in colnames: 168 row.append(collabels[c]) 169 writer.writerow(row) 170 171 for row in recs.keys(): 172 writer.writerow(recs[row]) 173 174 return
175