TweetFollow Us on Twitter

Dec 01 Python

Volume Number: 17 (2001)
Issue Number: 12
Column Tag: Python on the Mac

by Rob Bedford

Using Python on the Macintosh

Introduction to Python and MacPython

Introduction

This article is intended as an introduction to the Python language on the Mac. While this will require the introduction of the MacPython environment, it is not intended as a review of the MacPython environment. Python is an easy to learn language that is an excellent tool for making prototypes and quick GUI front ends. The Mac implementation also has hooks for Mac specific functionality such as Applescript and Quicktime. Hopefully this article will lead toward the reader further exploring Python.

Overview

Python is open source and the license is GPL compatible (as is MacPython). MacPython is the Mac implementation of the Python language. The package includes an interpreter capable of executing text files, an IDE, a GUI toolkit, and droplets to make applets or applications. The current version (2.1) is capable of running on System 9 or X (native) however the GUI toolkit does not run native on X at this time.

While Python files can be created with any text editor, the included IDE provides the ability to execute from the editor and access to a debugger in addition to file creation. The error reporting from within the IDE also tends to be more verbose and useful than those reported by the interpreter. While not necessary on the Mac, files should end in .py for compatibility with other operating systems.

The GUI toolkit is called Tkinter and is a Python implementation of Tk. Tk is the graphical toolkit created for building graphical user interfaces with TCL. While originally for TCL, Tk has been ported to Perl and Python also. Although there are other GUI toolkits available, Tkinter is the Python standard and has excellent support, portability and functionality. Among the widgets provided by Tkinter are Entry Field, Menu, Scrollbar, Button, Checkbox, Radiobutton, Scale (slider), Listbox, Text, Canvas and a variety of Canvas drawing widgets. The toolkit also provides three geometry managers grid, pack and place, which can be used individually or in combination. The grid manager aligns all objects within a grid. The pack manager is similar to packing in Java with the objects arranging themselves based upon window content and shape. The place manager places a widget at a precise coordinate.

WxPython is an alternative GUI toolkit that was not easily available at the time this article was written, however indications are that it will be available soon. While this toolkit is not as accepted for use with Python, it has some advantages that Tkinter does not such as printing support.

Python can be run as an interactive script or interpreted. To run interactively, open the Python interpreter and type the code into the provided window. Pressing Enter or Return causes the code to execute. To run Python code in interpreted mode, drag and drop the text file unto the PythonInterpreter application. However if desired an applet can be generated by either choosing Save As Applet while in the IDE or dropping the file on the BuildApplet droplet. Note that the created applets require that Python be installed to run. If a standalone application is desired there is a BuildApplication droplet provided for the task. When using the BuildApplication droplet if a syntax error is reported and the same code executes fine from the IDE and interpreter, be sure that the last line is blank (no tabs). This is probably caused by the script looking for code due to the indentation.

Python can be extended using C. This provides a seamless interface to native C code for faster execution.

Language

Python is an interpreted language that self compiles to byte code when possible. Python has good performance for an interpreted language but the speed increases after one run since all subsequent runs are from compiled byte code.

Python is fully object oriented (even integers are objects) however it can also be used as a sequential language. The syntax is C-like except that there are no end of line markers or braces used. The block structure is implemented based entirely upon indentation. Thus Python code is formatted into a readable structure by necessity. Python comments are indicated by # with everything after the # treated as a comment. Multiple lines of code cannot be commented in blocks however Python does provide a doc string that provides multi-line comments. There are tools that extract doc strings to create documentation from Python source files.

Python variables are typeless objects, however while data is stored there is a type associated with it. Thus a string can be stored in a variable then be overwritten with an integer.

In addition to standard types such as integer, string and real, Python defines dictionaries, lists and tuples. Although these types at first seem simple these additional types are very powerful. One example of the power would be using lists as dynamic structures. Also the structure can be extended and since the data is further down the list it will not effect most code that already exists.

Lists can contain anything. The elements need not be of the same type and can even themselves be lists. An index is used to access or change data. Additionally, you can slice sections out of them or concatenate them together. Tests for membership and length are also available.

Strings are very similar to lists with the elements containing characters. However strings are immutable and thus cannot be changed in place. For instance it is possible to add a group of characters to a string variable and then reassign a new group of characters. However single characters within the string variable cannot be altered (immutable). Tuples are similar to lists but tuples are immutable. While this seems to be an unnecessary duplication of lists it allows const-like operation.

Dictionaries are collections of data that are accessed by key. This provides better performance on large collections of data than lists.

When using Python in an object oriented fashion self provides a reference to the referring object. When defining a function in Python self must always be the first parameter in the argument list. When calling a function the self parameter is passed by default. The Super keyword references the objects parent class. Also when using Python as an object oriented language functions whose names begin and end in double underscores have special meaning. __init__ is called upon object initialization. __add__ and __mul__ are used to overload + and – respectively. Others are defined and are left to the reader to find.

Python also provides functionality that is associated with scripting languages such as the ability to execute external applications and regular expressions.

Starting Python

Begin by obtaining and installing Python. The official Python Language website is http://www.python.org and the official MacPython website is http://www.cwi.nl/~jack/macpython.html. First go to the Python site and download the documentation for Python. The documentation is not included in the MacPython distribution but is well done and worth the download time (the tutorial is highly recommended). Then go to the MacPython site and download the full installer.

The documentation expands to nine pdf files:

Api.pdf Python/C API Reference Manual
Dist.pdf Distributing Python Modules
Doc.pdf Documenting Python
Ext.pdf Extending and Embedding the Python
Interpreter
Inst.pdf Installing Python Modules
Lib.pdf Python Library Reference
Mac.pdf Macintosh Library Modules
Ref.pdf Python Reference Manuals
Tut.pdf Python Tutorial

The Python Library Reference and Python Reference Manuals will be used frequently and are worth converting trees to documents. The Python Tutorial is excellent and worth going through once. The other documents are useful but can be deferred until a higher level of proficiency is achieved.

Using Python

To illustrate the use of Python four examples will be presented, a simple Hello World, a GUI Hello World, a droplet or application to set the file creator code of text files, and finally a demonstration of various Tkinter widgets.

Hello World

Here is the traditional Hello World program. Open the Python IDE and select New from the File menu. In the new text file enter:

Print ‘Hello World’

Then press the Run All button. Your first Python program has just run.

Graphical Hello World

But Macs are graphical so next a graphical Hello World is next. The first line imports the Tkinter library for use. This can also be performed using from Tkinter import * which negates the need to use the Tkinter prefix. However the longer form was used to illustrate where Tkinter widgets are being used. Then Tk is started and stored in the variable base. After this we add the Button by passing it a container, in this case base, and the text to display. After setup is complete we enter the mainloop and are done.

import Tkinter

base = Tkinter.Tk()
Tkinter.Button(base, text = ‘Hello World’).pack()
base.mainloop()

Creator Code Editor

The following code is for a program to change the creator code of the file. The default operation is to read from a text file named type_preferences (in the same folder as the code) the creator code and type code (‘TEXT’) and set files that are dropped on it to that creator code. Files that are not of type ‘TEXT’ are ignored. Also the creator code can be set to the desired application by dropping it on the applet.

The code starts by importing the desired symbols. Although the imports are usually placed at the top this is not required. Go to the bottom and find if __name__ == ‘__main__’: this rather odd looking construct is very useful. If this module is imported into another program this code causes the main function to be ignored, however if execution begins in this module the check is true and main is executed. This allows each module to be tested in a standalone mode and contain test code that does not need to be deleted when the module is integrated. The main for this program is simple. Main checks the length of sys.argv and either creates a CFiletyper object or displays instructions to the user. To make this program more useful a GUI could be added in place of the display of instructions that allows the user to open files or set options via the GUI. So what is sys.argv? It is a list that contains the name of the applet including its path when the applet is double clicked. If items are dropped on the applet the name (including path) of each file is appended to the list containing the executing files name.

Upon creation of the CFiletyper object its __init__ routine is called. Now go back to the top of the code and examine the class declaration. Take notice of the colon as these are the one exception to delimiters and are easy to forget. The __init__ function is the standard constructor for Python. The first thing the routine checks is for argv lists of size two. If the size is two a FileSpec is created to store the file’s creator and type codes. Notice that creator and type codes are assigned in a single statement. If the type is ‘APPL’ in the file the user has dropped, a file called type_preferences is either opened or created. The new creator an type codes are then written to the file and the file closed. C programmers will find this code very familiar, because Python provides a wrapper for the C file routines. For Python experts all the resources needed to make extensions are available at the Python websites. After the data is written to the file the applet exits back to the finder.

If the type was not ‘APPL’ or the count was higher than two, then two routines are called. The first is getTypes that tries to open a file named ‘type_preferences’ that contains a type code and creator code. If this fails, assume the file is missing or corrupted and set the type code to ‘TEXT’ and the creator to Simple Text (‘ttxt’) then return. After the file is opened the text is stored in the list called data with each line becoming an item. The file is then closed. Then the data list is parsed, the first operation gets the first line and assigns the first four characters to self.Creator. The reason for taking only the first four characters is to delete the newline character. The same operation is then performed on the next item. The second function processFiles takes argv and slices off the program name creating a new list called fileList. Then get the fileinfo for each file using xstat. The last item in the list returned from xstat is the file’s type code. The type is checked to ensure it is a ‘TEXT’ file then set to the creator code to new creator code. The next two steps are not really necessary but provide the user some feedback by telling which files have been changed.

import sys
import os
import mac
import macfs

class CFiletyper:
	def __init__(self):
		#if one item was dropped see if it was an application
		if len(sys.argv) == 2:
			fileSpec = macfs.FSSpec(sys.argv[1])
			self.Creator, self.Type = fileSpec.GetCreatorType()
			if self.Type == ‘APPL’:
				prefFile = open(‘type_preferences’,’w’)
				prefFile.write(self.Creator)
				prefFile.write(‘\n’)
				prefFile.write(‘TEXT’)
				prefFile.close
			else:
				self.getTypes()
				self.processFiles()
		#otherwise process files
		else:
			self.getTypes()
			self.processFiles()

	def getTypes(self):
		try:
			prefFile = open(‘type_preferences’, ‘r’)
		except:
			self.Type = ‘TEXT’
			self.Creator = ‘ttxt’
			return
		data = prefFile.readlines()
		prefFile.close()
		self.Creator = data[0][:3]
		self.Type = data[1][:3]

	def processFiles(self):
		fileList = sys.argv[1:]
		for file in fileList:
			fileinfo = mac.xstat(file)
			if fileinfo[-1] == ‘TEXT’:
				fileSpec = macfs.FSSpec(file)
				fileSpec.SetCreatorType(self.Creator,
											 self.Type)
				print os.path.split(file)[1]
				print ‘Changing the creator code to Python IDE’

if __name__ == ‘__main__’:
	if len(sys.argv) > 1:
		CFiletyper()
	else:
		print ‘Drag and drop files onto the applet ‘ + 
							‘to set creator’
		print ‘Drag and drop application onto the ‘ +
							‘applet to set creator’

Tkinter Demo

The Tkinter demo is a simple program that has a button, checkbutton, radiobutton and scale widget. The __main__ function starts by initializing Tk and creating a Frame to contain the widgets. This frame is then passed to the __init__ function of the Test class. Finally the Frame is packed with a two-pixel buffer in the x and y direction then the main event loop is entered. Note that although the baseWin can be packed before creating the Test object the best results are always obtained when packing from inside to outside.

The Test class stores the frame passed for later use. Then creates a button widget and assigns the clicked function to it. The lambda declaration allows s to be resolved when the button is clicked and has the benefit of stopping the execution of clicked at button creation. Lambda is a Python keyword that allows for a function to be declared in line. Thus the assignment to command is in reality to function pointer that calls self.clicked. The checkbutton is then created and packed followed by a call to MakeEntry. MakeEntry then creates a frame to contain the Entry field and the accompanying label. Finally a radiobutton and scale are created and packed.

from Tkinter import *

class Test:
	def __init__(self, super):
		self.super = super
		Button(super, command = 
						lambda s = self : s.clicked(),
				text = ‘Hello World’).pack()
		Checkbutton(super, text = 
							‘A Check Button’).pack()
		self.MakeEntry(super)
		Radiobutton(super, text = ‘button 1’).pack()
		Scale(super, orient = ‘horizontal’).pack()
		
	def clicked(self):
		self.super.bell()
		
	def MakeEntry(self, super):
		container = Frame(super)
		Entry(container).pack(side = ‘right’)
		Label(container, text = ‘Enter something:’
			).pack(side = ‘left’)
		container.pack()
	
if __name__ == ‘__main__’:
	base = Tk()
	baseWin = Frame(base)
	Test(baseWin)
	baseWin.pack(padx = 2, pady = 2)
	base.mainloop()

Python Extensions

There is not enough space in this article to cover all of the Python extensions available. However Pmw (Python Mega Widgets) will be covered to illustrate the installation of an extension and because of the usefulness of Pmw for a beginner.

Pmw is a set of widgets that extend Tkinter. Pmw widgets are created in Python primarily for Windows. They provide a good example on how Tkinter can be extended and are very useful despite some flaws. While they work on the Mac the appearance is sometimes less than desirable. The notebook widget in particular has a terrible appearance that could not be used in a deliverable project.

To install Pmw go to the Vaults of Parnassus (see Resources) and download the current version. Once the files have been extracted, place the entire directory in the Python:Extensions folder. Launch the EditPythonPrefs utility and scroll to the bottom. Add $(PYTHON):Extensions:Pmw to the list and close the utility. Go to Pmw_0_8_3:Demos and drag and drop All.py to the interpreter, this should launch a demonstration of all the Pmw widgets. The same result could have been obtained with the utility created in the last section and double clicking to execute the code.

The Future

While the current implementation is good the future is even brighter. Because of the UNIX heritage of X and Python, support should only get better.

The exception to this may Tkinter support, if Apple were to provide a way to run X windows apps natively then Tkinter support would be optimal. However if Tkinter has to depend on a Tk port to Carbon or Aqua then the implementation is subject to more violatility.

Now for the good news, Python already can run native on X. And the event model and other UNIX aspects of OS X more closely follow the Python design paradigm than does windows.

Resources

In addition to the Python Language and MacPython site, another site worth visiting is the Vaults of Parnassus at http://www.vex.net/parnassus. While this site is not Mac specific it contains a wide variety of examples and other resources that are invaluable.

  • BBEdit users can obtain a Python plug-in at http://homepage.mac.com/christopherstern. Note that this does not work with BBEdit Lite.
  • While the documentation is excellent the following books will also be useful. While the Python documentation is excellent the Tkinter documentation is very poor and the Grayson book highly recommended.
  • Learning Python (Help for Programmers), by Mark Lutz & David Ascher, March 1999, ISBN 1-56592-464-9
  • Python and Tkinter Programming, by John E Grayson, 2000, ISBN 1-884777-81-3
  • The Quick Python Book by Daryl Harms and Kenneth McDonald, 1999 ISBN 1-884777-74-0
  • While the Learning Python book can be avoided if money is tight, the Tkinter book is a necessity. A fair portion of the book is dedicated to Pmw but the back has the best documentation available for Tkinter.
  • The comp.lang.python newsgroup is also an excellent source of help. For Mac specific questions the PythonMac SIG is probably a better source though. For information on the PythonMac SIG go to the MacPython page.

Conclusion

Learning Python is both easy and worthwhile. Python is a mature language and useful tool for programmers and is suitable for projects of all sizes. The interpreted nature of Python allows for quick code/test cycles. The byte code compilation of Python yields better speed than traditional scripting languages. The community is very helpful and the tools actively supported. Python’s UNIX heritage will only make the mac future brighter. But most importantly Python is a pleasure to use.


Rob Bedford has worked on a variety of platforms implementing systems from embedded automotive to missile defense. When not coding Bob is riding his motorcycle while trying to find new waterfalls to make QTVR panoramas of.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

macOS Catalina 10.15.7 - An Operating Sy...
macOS Catalina gives you more of everything you love about Mac. Experience three all-new media apps: Apple Music, Apple TV, and Apple Podcasts. Locate a missing Mac with the new Find My app. And now... Read more
BlueStacks 4.230.10 - Run Android applic...
BlueStacks App Player lets you run your Android apps fast and fullscreen on your Mac. Feature comparison chart How to install Bluestacks on your Mac Go to MacUpdate and click the green "Download"... Read more
Kodi 18.8 - Powerful media center tool f...
Kodi (was XBMC) is an award-winning free and open-source (GPL) software media player and entertainment hub that can be installed on Linux, OS X, Windows, iOS, and Android, featuring a 10-foot user... Read more
Wireshark 3.2.7 - Network protocol analy...
Wireshark is one of the world's foremost network protocol analyzers, and is the standard in many parts of the industry. It is the continuation of a project that started in 1998. Hundreds of... Read more
Fantastical 3.2 - Create calendar events...
Fantastical is the Mac calendar you'll actually enjoy using. Creating an event with Fantastical is quick, easy, and fun: Open Fantastical with a single click or keystroke Type in your event... Read more
Mindjet MindManager 13.2.132 - Professio...
MindManager is a powerful mind mapping tool that increases your productivity. From business plans or developing a new website, its robust mind maps have all the features you need to accomplish your... Read more
Tweetbot 3.4.3 - Popular Twitter client.
Tweetbot is a full-featured OS X Twitter client with a lot of personality. Whether it's the meticulously-crafted interface, sounds and animation, or features like multiple timelines and column views... Read more
OmniPlan 4.0.2 - Professional-grade proj...
With OmniPlan, you can create logical, manageable project plans with Gantt charts, schedules, summaries, milestones, and critical paths. Break down the tasks needed to make your project a success,... Read more
Numbers 10.2 - Apple's spreadsheet...
With Apple Numbers, sophisticated spreadsheets are just the start. The whole sheet is your canvas. Just add dramatic interactive charts, tables, and images that paint a revealing picture of your data... Read more
A Better Finder Attributes 6.25 - Change...
A Better Finder Attributes 6 allows you to change JPEG & RAW shooting dates, JPEG EXIF meta-data tags, file creation & modification dates, file flags and deal with invisible files. Correct... Read more

Latest Forum Discussions

See All

BTS Universe Story, the social game that...
Netmarble's highly anticipated social game, BTS Universe Story, is available now for iOS and Android. It's the second collaboration between the hugely successful mobile developer and the K-pop superstars following BTS World. [Read more] | Read more »
The 5 Best Mobile Games Like Hades
Supergiant Games finally released Hades upon the world this week, and we’re loving it. The game plays to all of the studio’s strengths while still retaining a strong sense of identity. It also just so happens to play rather well using the Steam... | Read more »
A Year of Apple Arcade: The Good, The Ba...
Apple Arcade has persisted for just over a year at this point, and although that means I've been busy ranking and re-ranking every game on the service for just about as long, I haven't done much reflection on the service as a whole. [Read more] | Read more »
Animal Restaurant anniversary event team...
Animal idle simulator Animal Restaurant is celebrating its first-year anniversary with a crossover event with popular YouTube series Aaron’s Animals. [Read more] | Read more »
Raziel: Dungeon Arena is a hack 'n...
Raziel: Dungeon Arena is available now on mobile and will appeal to fans of both comic books and old school dungeon crawlers. Not only will you hack 'n' slash your way through mobs of enemies but there's also fully-narrated animated comic to enjoy... | Read more »
Steam Link Spotlight - Hades
Steam Link Spotlight is a feature where we look at PC games that play exceptionally well using the Steam Link app. Our last entry was on Disco Elysium. Read about how it plays using Steam Link over here. | Read more »
Microsoft has acquired ZeniMax Media and...
In the latest of a series of blockbuster moves, Microsoft has now acquired Zenimax Media and its subsidiary, Bethesda Softworks, for $7.5 billion. [Read more] | Read more »
Infinity Mechs is an upcoming idle game...
Indie developer SkullStar studio has announced an upcoming idle mech game called Infinity Mechs. It draws inspiration from the mobile game Iron Saga and has been officially licensed by Game Duchy. It's set to launch for both iOS and Android on... | Read more »
PUBG Mobile Lite's latest update se...
PUBG Mobile Lite, the streamlined version of the popular battle royale that's designed to work on less powerful devices, sees the return of a popular game variant today, Survive Till Dawn mode. It arrives as part of the 0.19.0 content update. [... | Read more »
Matchy Catch, Jyamma Games’ new hyper-ca...
Matchy Catch is a new hyper-casual puzzler from Jyamma Games, the Italian studio behind the Pong-inspired puzzle-adventure Hi-Ball Rush. It’s only the developer’s second game for iOS and Android devices, but it promises to be every bit as fun and... | Read more »

Price Scanner via MacPrices.net

Lowest price anywhere: New 13″ 2.0GHz MacBook...
Amazon has new 2020 13″ 2.0GHz/512GB MacBook Pros with 10th generation Intel processors back in stock on sale today for $200 off Apple’s MSRP. Shipping is free. Be sure to purchase the MacBook Pro... Read more
Apple Pro Display XDR with Nano-Texture Glass...
Amazon Apple Premier Partner GatorTec has the Apple Pro Display XDR with Nano-Texture Glass on sale for $5599 shipped, on Amazon. Their price is $400 off Apple’s MSRP, and it’s the cheapest price... Read more
Get a 2019 13″ MacBook Air for only $779 toda...
Apple has clearance, Certified Refurbished, 2019 13″ 1.6GHz/128GB MacBook Airs available again for $779. Each MacBook features a new outer case, comes with a standard Apple one-year warranty, and is... Read more
2020 11″ iPad Pros on sale today for $50-$75...
Apple reseller Expercom has new 2020 11″ Apple iPad Pros on sale for $50-$75 off MSRP, with prices starting at $749. These are the same iPad Pros sold by Apple in their retail and online stores: – 11... Read more
Apple has restocked 2020 13″ MacBook Airs sta...
Apple has restocked Certified Refurbished 2020 13″ MacBook Airs starting at only $849 and up to $200 off the cost of new Airs. Each MacBook features a new outer case, comes with a standard Apple one-... Read more
Apple’s new 8th generation 10.2″ iPads are on...
Amazon is discounting new 2020 8th generation 10.2″ Apple iPads by up to $35 off MSRP with prices starting at only $299. Shipping is free. These are the same iPads sold by Apple in their retail and... Read more
Today on Woot: Apple refurbished 16″ MacBook...
Amazon-owned Woot has Apple refurbished 16″ MacBook Pros available today for up to $605 off the cost of new models. Shipping is free for Prime members: – 16″ 6-Core MacBook Pros: $1874.99 $525 off... Read more
Apple offers last year’s iMacs for as little...
Apple has dropped prices on last year’s 21″ iMacs, Certified Refurbished, by up to $240 off the original cost of new models. Apple’s one-year warranty is standard, shipping is free, and each iMac... Read more
Get last year’s 32GB iPad for only $279 today...
Amazon has dropped prices on clearance 2019 Silver 32GB WiFi Apple iPads by $50 to $279 shipped. That’s the cheapest price available for a new 10.2″ iPad from any Apple reseller. Act now if you’re... Read more
New Apple Watch Series 6 and SE models now on...
Amazon is the first Apple reseller to offer the new Apple Watch Series 6 and Apple Watch SE models at discounted sale prices. These are the same Watches sold by Apple in their retail and online... Read more

Jobs Board

Security Officer ($23.00/Hourly) - *Apple*...
**Security Officer \($23\.00/Hourly\) \- Apple Store** **Description** About NMS Built on a culture of safety and integrity, NMSdelivers award\-winning, integrated Read more
*Apple* Certified Macintosh Technician - Exc...
Apple Certified Macintosh Technician Summary Title: Apple Certified Macintosh Technician ID:350 Department:All Location:Falls Church, VA Description Apple Read more
Department Manager- Tech Shop/ *Apple* Stor...
…their parents want, and our faculty needs. As a Department Manager in our Tech Shop/ Apple Store you will spend the majority of your time on the sales floor engaging Read more
Security Officer ($23.00/Hourly) - *Apple*...
**Security Officer \($23\.00/Hourly\) \- Apple Store** **Description** About NMS Built on a culture of safety and integrity, NMSdelivers award\-winning, integrated Read more
Product Manager, *Apple* Commercial Sales -...
Product Manager, Apple Commercial Sales Austin, TX, US Requisition Number:77652 As an Apple Product Manager for the Commercial Sales team at Insight, you Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.