SpecPython is a GUI-Builder for Python + Tkinter. It is based on
SpecTcl/SpecJava (the gui builder for Tcl).


This is version 0.1 of SpecPython. I wrote it in 2 days, so it is
incomplete. But a lot of things are supported.

I would appreciate any suggestions, bug reports, patches or whatever.


What do you need?
---------------
	- SpecJava 0.3 and tcl7.5, tk4.1 or higher with blt
	- SpecTcl 1.0 and tcl7.6, tk4.2 or higher


Install:
--------
1)	Install SpecJava or SpecTcl
2)	Copy python_init.tk into your specjava/spectcl directory
        (e.g. /usr/local/lib/SpecTcl).
3)	Change the environment variables in specPython.
4)	Copy specPython into your bin directory
	(e.g. /usr/local/bin).
5)	Copy SpecTclrc into your home directory.

SpecTclrc contain a bit of code that creates tcl images for all gif
files in your current directory. It creates an images with the name x
if the name of the image file is x.gif. You can use these images in
SpecPython.


Features:
---------
SpecPython creates:
	- a class. You should inherit you application class from this
	  class.
	- instances for all specified variables with StringVar ().
	- images for all specified images.
	- empty callback for each command.
	- all widgets.
	- the scrollbar/listbox connections

Examples:
---------
SpecPython generates code like this:
====================================
# generated by SpecPython

# interface generated by SpecTcl version 0.3 from untitled.py.ui
# Experimental python tk version using the grid geometry manager

import Tkinter; Tk = Tkinter

class untitled (Tk.Frame):

	def __init__ (self, master = None, iconPath = '.', **packOptions):
		Tk.Frame.__init__ (self, master)
		self.CreateVariables ()
		self.CreateImages (iconPath)
		self.CreateWidgets ()
		self.pack (packOptions)

	def CreateVariables (self):
		self.input_1 = Tk.StringVar ()
		self.input_2 = Tk.StringVar ()

	def CreateImages (self, iconPath):
		self.__image_runner__ = Tk.PhotoImage ('runner', file = iconPath + '/' + 'runner.gif')

	def callback_1 (self):
		pass

	def callback_2 (self):
		pass

	def CreateWidgets (self):
		self.label_1 = Tk.Label (self, {
				'text' : 'label'
				})
		self.entry_1 = Tk.Entry (self, {
				'textvariable' : self.input_1
				})
		self.listbox_1 = Tk.Listbox (self, {
				'height' : '0',
				'width' : '0'
				})
		self.scrollbar_1 = Tk.Scrollbar (self, {
				'orient' : 'v'
				})
		self.label_2 = Tk.Label (self, {
				'image' : 'runner',
				'text' : 'label'
				})
		self.entry_2 = Tk.Entry (self, {
				'textvariable' : self.input_2
				})
		self.button_1 = Tk.Button (self, {
				'command' : self.callback_1,
				'padx' : '11',
				'pady' : '4',
				'text' : 'button'
				})
		self.button_2 = Tk.Button (self, {
				'command' : self.callback_2,
				'padx' : '11',
				'pady' : '4',
				'text' : 'button'
				})
		self.listbox_1['yscrollcommand'] = self.scrollbar_1.set
		self.scrollbar_1['command'] = self.listbox_1.yview
		self.label_1.grid({
				'in' : self,
				'column' : '1',
				'row' : '1',
				'sticky' : ''
				})
		self.entry_1.grid({
				'in' : self,
				'column' : '2',
				'row' : '1',
				'sticky' : ''
				})
		self.listbox_1.grid({
				'in' : self,
				'column' : '3',
				'row' : '1',
				'rowspan' : '3',
				'sticky' : 'nsew'
				})
		self.scrollbar_1.grid({
				'in' : self,
				'column' : '4',
				'row' : '1',
				'rowspan' : '3',
				'sticky' : 'ns'
				})
		self.label_2.grid({
				'in' : self,
				'column' : '1',
				'row' : '2',
				'sticky' : ''
				})
		self.entry_2.grid({
				'in' : self,
				'column' : '2',
				'row' : '2',
				'sticky' : ''
				})
		self.button_1.grid({
				'in' : self,
				'column' : '1',
				'row' : '3',
				'sticky' : ''
				})
		self.button_2.grid({
				'in' : self,
				'column' : '2',
				'row' : '3',
				'sticky' : ''
				})
		self.rowconfigure (1, {'weight' : 1, 'minsize' : 30})
		self.rowconfigure (2, {'weight' : 0, 'minsize' : 30})
		self.rowconfigure (3, {'weight' : 0, 'minsize' : 30})
		self.columnconfigure (1, {'weight' : 0, 'minsize' : 30})
		self.columnconfigure (2, {'weight' : 0, 'minsize' : 30})
		self.columnconfigure (3, {'weight' : 0, 'minsize' : 30})
		self.columnconfigure (4, {'weight' : 0, 'minsize' : 30})


if __name__ == '__main__':
	app = untitled (fill = 'both', expand = 1)
	app.mainloop ()
=================================================


I would appreciate any suggestions, bug reports, patches or whatever.

////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
|Andreas Koschinsky|email: marvin@logware.de|
|logware GmbH|Schwedenstr. 9|13359 Berlin|phone: +49 30 49901-243|fax: -139|
--------------------------------------------------------------------------------
She's not truly a Bundy. You see, your mother is just a Bundy by marriage.
She's part of the curse. But we are blood Bundies. We are truly doomed!
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\////////////////////////////////////////
