Module tkintertable.Tables_IO

Import and export classes. Created Oct 2008 Copyright (C) Damien Farrell

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Source code
#!/usr/bin/env python
"""
    Import and export classes.
    Created Oct 2008
    Copyright (C) Damien Farrell

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
"""

from __future__ import absolute_import, division, print_function
try:
    from tkinter import *
    from tkinter.ttk import *
    from tkinter import filedialog, messagebox, simpledialog
except:
    from Tkinter import *
    from ttk import *
    import tkFileDialog as filedialog
    import tkSimpleDialog as simpledialog
    import tkMessageBox as messagebox

import os, csv

class TableImporter:
    """Provides import utility methods for the Table and Table Model classes"""

    def __init__(self):
        """Setup globals"""
        #self.separator = ','
        self.separator_list = [',',' ','\t',':']
        self.var_sep = StringVar()
        self.var_sep.set(',')
        return

    def import_Dialog(self, parent):
        """Allows user to set some import options"""

        self.parent=parent
        self.master=Toplevel()
        self.master.title("Import Data")
        self.xsize = 450
        self.ysize = 370
        top=self.master.winfo_toplevel()
        self.master.geometry('400x400+200+200')

        self.sep_choice = Combobox(self.master,
                            text = 'Record separator:',
                            textvariable = self.var_sep,
                            values = self.separator_list,
                            width = 4)
        self.var_sep.trace('w', self.update_display)
        Label(self.master,text='separator:').grid(row=0,column=0,sticky='nw',padx=2,pady=2)
        self.sep_choice.grid(row=0,column=1,sticky='nw',padx=2,pady=2)
        #place for text preview frame
        self.textframe = Frame(self.master)
        self.textframe.grid(row=1,column=0,columnspan=5,sticky='news',padx=2,pady=2)
        self.previewarea = Text(self.textframe, bg='white', width=400, height=500)
        self.previewarea.pack(fill=BOTH, expand=1)
        #buttons
        self.openButton = Button(self.master, text = 'Open File',
                command = self.do_openFile )
        self.openButton.grid(row=3,column=0,sticky='news',padx=2,pady=2)
        self.importButton = Button(self.master, text = 'Do Import',
                command = self.do_ModelImport )
        self.importButton.grid(row=3,column=1,sticky='news',padx=2,pady=2)
        self.CancelButton = Button(self.master, text = 'Cancel',
                command = self.close )
        self.CancelButton.grid(row=3,column=2,sticky='news',padx=2,pady=2)
        self.master.columnconfigure(0,weight=1)
        self.master.rowconfigure(1,weight=1)
        return self.master

    def do_openFile(self):

        self.datafile = self.open_File(self.parent)
        self.update_display()
        return

    def open_File(self, parent):

        savedir = os.getcwd()
        filename=filedialog.askopenfile(defaultextension='.csv',
                                                initialdir=savedir,
                                                initialfile='',
                                                filetypes=[("Data file","*.csv"),
                                                           ("All files","*.*")],
                                                title='Choose data from a .csv file saved as excel spreadsheet in .csv format (comma separated list)',
                                                parent=parent)
        if filename and os.path.exists(filename.name) and os.path.isfile(filename.name):
            datafile = filename.name
        return datafile

    def update_display(self, *args):
        """Preview loaded file"""

        sep = self.var_sep.get()
        self.previewarea.delete(1.0, END)
        reader = csv.reader(open(self.datafile, "r"), delimiter=sep)
        for row in reader:
            self.previewarea.insert(END,row)
            self.previewarea.insert(END,'\n')
        return

    def do_ModelImport(self):
        """imports and places the result in self.modeldata"""

        self.data = self.ImportTableModel(self.datafile)
        self.close()
        return

    def ImportTableModel(self, filename):
        """Import table data from a comma separated file and create data for a model."""

        if not os.path.isfile(filename):
            return None
        try:
            sep = self.var_sep.get()
        except:
            sep = ','
        #takes first row as field names
        dictreader = csv.DictReader(open(filename, "r"), delimiter=sep)
        dictdata = {}
        count=0
        for rec in dictreader:
            dictdata[count]=rec
            count=count+1
        return dictdata

    def close(self):
        self.master.destroy()
        return

class TableExporter:
    def __init__(self):
        """Provides export utility methods for the Table and Table Model classes"""

        return

    def ExportTableData(self, table, sep=None):
        """Export table data to a comma separated file"""

        parent=table.parentframe
        filename = filedialog.asksaveasfilename(parent=parent,defaultextension='.csv',
                                                  filetypes=[("CSV files","*.csv")] )
        if not filename:
            return
        if sep == None:
            sep = ','
        writer = csv.writer(open(filename, "w"), delimiter=sep)
        model=table.getModel()
        recs = model.getAllCells()
        #take column labels as field names
        colnames = model.columnNames
        collabels = model.columnlabels
        row=[]
        for c in colnames:
            row.append(collabels[c])
        writer.writerow(row)
        for row in recs.keys():
            writer.writerow(recs[row])
        return

Classes

class TableExporter

Provides export utility methods for the Table and Table Model classes

Source code
class TableExporter:
    def __init__(self):
        """Provides export utility methods for the Table and Table Model classes"""

        return

    def ExportTableData(self, table, sep=None):
        """Export table data to a comma separated file"""

        parent=table.parentframe
        filename = filedialog.asksaveasfilename(parent=parent,defaultextension='.csv',
                                                  filetypes=[("CSV files","*.csv")] )
        if not filename:
            return
        if sep == None:
            sep = ','
        writer = csv.writer(open(filename, "w"), delimiter=sep)
        model=table.getModel()
        recs = model.getAllCells()
        #take column labels as field names
        colnames = model.columnNames
        collabels = model.columnlabels
        row=[]
        for c in colnames:
            row.append(collabels[c])
        writer.writerow(row)
        for row in recs.keys():
            writer.writerow(recs[row])
        return

Methods

def ExportTableData(self, table, sep=None)

Export table data to a comma separated file

Source code
def ExportTableData(self, table, sep=None):
    """Export table data to a comma separated file"""

    parent=table.parentframe
    filename = filedialog.asksaveasfilename(parent=parent,defaultextension='.csv',
                                              filetypes=[("CSV files","*.csv")] )
    if not filename:
        return
    if sep == None:
        sep = ','
    writer = csv.writer(open(filename, "w"), delimiter=sep)
    model=table.getModel()
    recs = model.getAllCells()
    #take column labels as field names
    colnames = model.columnNames
    collabels = model.columnlabels
    row=[]
    for c in colnames:
        row.append(collabels[c])
    writer.writerow(row)
    for row in recs.keys():
        writer.writerow(recs[row])
    return
class TableImporter

Provides import utility methods for the Table and Table Model classes

Setup globals

Source code
class TableImporter:
    """Provides import utility methods for the Table and Table Model classes"""

    def __init__(self):
        """Setup globals"""
        #self.separator = ','
        self.separator_list = [',',' ','\t',':']
        self.var_sep = StringVar()
        self.var_sep.set(',')
        return

    def import_Dialog(self, parent):
        """Allows user to set some import options"""

        self.parent=parent
        self.master=Toplevel()
        self.master.title("Import Data")
        self.xsize = 450
        self.ysize = 370
        top=self.master.winfo_toplevel()
        self.master.geometry('400x400+200+200')

        self.sep_choice = Combobox(self.master,
                            text = 'Record separator:',
                            textvariable = self.var_sep,
                            values = self.separator_list,
                            width = 4)
        self.var_sep.trace('w', self.update_display)
        Label(self.master,text='separator:').grid(row=0,column=0,sticky='nw',padx=2,pady=2)
        self.sep_choice.grid(row=0,column=1,sticky='nw',padx=2,pady=2)
        #place for text preview frame
        self.textframe = Frame(self.master)
        self.textframe.grid(row=1,column=0,columnspan=5,sticky='news',padx=2,pady=2)
        self.previewarea = Text(self.textframe, bg='white', width=400, height=500)
        self.previewarea.pack(fill=BOTH, expand=1)
        #buttons
        self.openButton = Button(self.master, text = 'Open File',
                command = self.do_openFile )
        self.openButton.grid(row=3,column=0,sticky='news',padx=2,pady=2)
        self.importButton = Button(self.master, text = 'Do Import',
                command = self.do_ModelImport )
        self.importButton.grid(row=3,column=1,sticky='news',padx=2,pady=2)
        self.CancelButton = Button(self.master, text = 'Cancel',
                command = self.close )
        self.CancelButton.grid(row=3,column=2,sticky='news',padx=2,pady=2)
        self.master.columnconfigure(0,weight=1)
        self.master.rowconfigure(1,weight=1)
        return self.master

    def do_openFile(self):

        self.datafile = self.open_File(self.parent)
        self.update_display()
        return

    def open_File(self, parent):

        savedir = os.getcwd()
        filename=filedialog.askopenfile(defaultextension='.csv',
                                                initialdir=savedir,
                                                initialfile='',
                                                filetypes=[("Data file","*.csv"),
                                                           ("All files","*.*")],
                                                title='Choose data from a .csv file saved as excel spreadsheet in .csv format (comma separated list)',
                                                parent=parent)
        if filename and os.path.exists(filename.name) and os.path.isfile(filename.name):
            datafile = filename.name
        return datafile

    def update_display(self, *args):
        """Preview loaded file"""

        sep = self.var_sep.get()
        self.previewarea.delete(1.0, END)
        reader = csv.reader(open(self.datafile, "r"), delimiter=sep)
        for row in reader:
            self.previewarea.insert(END,row)
            self.previewarea.insert(END,'\n')
        return

    def do_ModelImport(self):
        """imports and places the result in self.modeldata"""

        self.data = self.ImportTableModel(self.datafile)
        self.close()
        return

    def ImportTableModel(self, filename):
        """Import table data from a comma separated file and create data for a model."""

        if not os.path.isfile(filename):
            return None
        try:
            sep = self.var_sep.get()
        except:
            sep = ','
        #takes first row as field names
        dictreader = csv.DictReader(open(filename, "r"), delimiter=sep)
        dictdata = {}
        count=0
        for rec in dictreader:
            dictdata[count]=rec
            count=count+1
        return dictdata

    def close(self):
        self.master.destroy()
        return

Methods

def ImportTableModel(self, filename)

Import table data from a comma separated file and create data for a model.

Source code
def ImportTableModel(self, filename):
    """Import table data from a comma separated file and create data for a model."""

    if not os.path.isfile(filename):
        return None
    try:
        sep = self.var_sep.get()
    except:
        sep = ','
    #takes first row as field names
    dictreader = csv.DictReader(open(filename, "r"), delimiter=sep)
    dictdata = {}
    count=0
    for rec in dictreader:
        dictdata[count]=rec
        count=count+1
    return dictdata
def close(self)
Source code
def close(self):
    self.master.destroy()
    return
def do_ModelImport(self)

imports and places the result in self.modeldata

Source code
def do_ModelImport(self):
    """imports and places the result in self.modeldata"""

    self.data = self.ImportTableModel(self.datafile)
    self.close()
    return
def do_openFile(self)
Source code
def do_openFile(self):

    self.datafile = self.open_File(self.parent)
    self.update_display()
    return
def import_Dialog(self, parent)

Allows user to set some import options

Source code
def import_Dialog(self, parent):
    """Allows user to set some import options"""

    self.parent=parent
    self.master=Toplevel()
    self.master.title("Import Data")
    self.xsize = 450
    self.ysize = 370
    top=self.master.winfo_toplevel()
    self.master.geometry('400x400+200+200')

    self.sep_choice = Combobox(self.master,
                        text = 'Record separator:',
                        textvariable = self.var_sep,
                        values = self.separator_list,
                        width = 4)
    self.var_sep.trace('w', self.update_display)
    Label(self.master,text='separator:').grid(row=0,column=0,sticky='nw',padx=2,pady=2)
    self.sep_choice.grid(row=0,column=1,sticky='nw',padx=2,pady=2)
    #place for text preview frame
    self.textframe = Frame(self.master)
    self.textframe.grid(row=1,column=0,columnspan=5,sticky='news',padx=2,pady=2)
    self.previewarea = Text(self.textframe, bg='white', width=400, height=500)
    self.previewarea.pack(fill=BOTH, expand=1)
    #buttons
    self.openButton = Button(self.master, text = 'Open File',
            command = self.do_openFile )
    self.openButton.grid(row=3,column=0,sticky='news',padx=2,pady=2)
    self.importButton = Button(self.master, text = 'Do Import',
            command = self.do_ModelImport )
    self.importButton.grid(row=3,column=1,sticky='news',padx=2,pady=2)
    self.CancelButton = Button(self.master, text = 'Cancel',
            command = self.close )
    self.CancelButton.grid(row=3,column=2,sticky='news',padx=2,pady=2)
    self.master.columnconfigure(0,weight=1)
    self.master.rowconfigure(1,weight=1)
    return self.master
def open_File(self, parent)
Source code
def open_File(self, parent):

    savedir = os.getcwd()
    filename=filedialog.askopenfile(defaultextension='.csv',
                                            initialdir=savedir,
                                            initialfile='',
                                            filetypes=[("Data file","*.csv"),
                                                       ("All files","*.*")],
                                            title='Choose data from a .csv file saved as excel spreadsheet in .csv format (comma separated list)',
                                            parent=parent)
    if filename and os.path.exists(filename.name) and os.path.isfile(filename.name):
        datafile = filename.name
    return datafile
def update_display(self, *args)

Preview loaded file

Source code
def update_display(self, *args):
    """Preview loaded file"""

    sep = self.var_sep.get()
    self.previewarea.delete(1.0, END)
    reader = csv.reader(open(self.datafile, "r"), delimiter=sep)
    for row in reader:
        self.previewarea.insert(END,row)
        self.previewarea.insert(END,'\n')
    return