#!/usr/bin/env python
#
# $Id: SimpleTable.py,v 1.4 2001/11/03 11:05:22 doughellmann Exp $
#
# Copyright 2001 Doug Hellmann.
#
#
# All Rights Reserved
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
# granted, provided that the above copyright notice appear in all
# copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of Doug
# Hellmann not be used in advertising or publicity pertaining to
# distribution of the software without specific, written prior
# permission.
#
# DOUG HELLMANN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
# NO EVENT SHALL DOUG HELLMANN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
"""Defines a basic (rather memory intensive) table widget.
"""
__rcs_info__ = {
#
# Creation Information
#
'module_name' : '$RCSfile: SimpleTable.py,v $',
'rcs_id' : '$Id: SimpleTable.py,v 1.4 2001/11/03 11:05:22 doughellmann Exp $',
'creator' : 'Doug Hellmann <doug@hellfly.net>',
'project' : 'PmwContribD',
'created' : 'Sun, 01-Apr-2001 13:15:21 EDT',
#
# Current Information
#
'author' : '$Author: doughellmann $',
'version' : '$Revision: 1.4 $',
'date' : '$Date: 2001/11/03 11:05:22 $',
}
#
# Import system modules
#
from Tkinter import *
import Pmw
import string
#
# Import Local modules
#
#
# Module
#
class SimpleTable(Pmw.LabeledWidget):
"""Defines a basic (rather memory intensive) table widget.
The widget looks something like::
|----------------|
|Col |Col |Col |
|----------------|
|Data|Data|Data |
| | | |
|----------------|
Options
'columns' -- Define the number of columns to be shown.
"""
def __init__(self, parent=None, **kw):
INITOPT = Pmw.INITOPT
optiondefs = (
('columns', None, self._changeColumns),
)
Pmw.LabeledWidget.__init__(self, parent=parent)
# Create interior
self.__createInterior()
# Initialize option based information
self.initialiseoptions(self.__class__)
return
def __createInterior(self):
interior = self.interior()
tabletext = self.createcomponent(
'tabletext',
(), None,
Text,
(interior,),
tabs=('10c', '20c', RIGHT, '25c'),
wrap='none',
)
tabletext.pack(
side=TOP,
expand=YES,
fill=BOTH,
)
return
def _changeColumns(self):
print 'changing column configuration'
return
def clear(self):
tw = self.component('tabletext')
tw.delete('0.0', 'end')
return
def setfromtext(self, text, fieldSep='\t', recordSep='\n', colWidth=150):
"""
Set the table contents from a text block which requires parsing.
Arguments
'text' -- body of text to display
'fieldSep' -- character/string appearing between fields
'recordSep' -- character/string appearing between records
'colWidth' -- width of columns on screen, in pixels (all
columns are the same width)
"""
tw = self.component('tabletext')
self.clear()
if not text:
# Clear the display
return
records = string.split(text, recordSep)
if not records:
# They sent us no records
return
numColumns = len(string.split(records[0], fieldSep))
tabs = []
for i in range(1, numColumns+1):
tabs.append(i * colWidth)
tabs = tuple(tabs)
tw.configure(tabs=tabs)
# Replace the fieldSeparator with tabs
if fieldSep != '\t':
text = string.replace(text, fieldSep, '\t')
# Replace the record separator with newlines
if recordSep != '\n':
text = string.replace(text, recordSep, '\n')
# Stick the text in the widget
tw.insert('end', text)
return
if __name__ == '__main__':
from GuiAppD import GuiAppD
class SimpleTableTest(GuiAppD):
appname='SimpleTable Test Application'
def createInterface(self):
table = self.createcomponent(
'testtable',
(), None,
SimpleTable,
(self.interior(),),
)
table.pack(
side=TOP,
expand=YES,
fill=BOTH,
)
text = open('/etc/passwd', 'rt').read()
table.setfromtext(text, ':', '\n')
# for i in range(0, 15):
# table.component('tabletext').insert(
# 'end',
# 'Before%d\tMiddle%d\tNext%d\tEnd%d\n' \
# % (i, i, i, i))
# table.component('tabletext').insert('end', 'A lot of text before the first tab.\tThen a lot of text in the middle.\tNow a lot of text at the end.')
return
SimpleTableTest().run()
|