[Edu-sig] graphics programming with Python

Daniel Yoo dyoo@hkn.eecs.berkeley.edu
Wed, 9 May 2001 03:16:29 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--545289610-1210645831-989403251=:13714
Content-Type: TEXT/PLAIN; charset=US-ASCII

Here's a preliminary version of a simplified interface to a Tkinter
canvas.  It's simple enough so that the user just needs to type:

###
from graphics import *

def drawBox(x1, y1, x2, y2):
    """Draws a box where the upper left is (x1, y1), and the
    lower right is (x2, y2)."""
    positionPen(x1, y1)
    drawLineTo(x2, y1)
    drawLineTo(x2, y2)
    drawLineTo(x1, y2)
    drawLineTo(x1, y1)

drawBox(-100, 100, 100, -100)
###

to get a box drawn.  By default, the Canvas is 400x400, and the user can
send commands like:

    drawLine
    drawPoint
    setRGBColor

without having to worry about creating a canvas.  Also, it uses normal
rectangular coordinates, so (0, 0) is at the center, (200, 200) is the
upper right corner, and (-200, -200) is the bottom left.

Please give suggestions on this; I just typed this up yesterday, so it
surely has room for improvement and clarity.

I hope this is useful!

--545289610-1210645831-989403251=:13714
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="graphics.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0105090314110.13714@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="graphics.py"

IiIiVGhpcyBpcyBhIHNtYWxsIGdyYXBoaWNzIG1vZHVsZSB0aGF0IG1pbWlj
cyBzb21lIHRoZSBmdW5jdGlvbmFsaXR5DQpvZiB3aGF0IHRoZSBDUzMgc3R1
ZGVudHMgdXNlIHRvIGRvIGZyYWN0YWwgZ3JhcGhpY3MuICBJdCdzIHNpbXBs
aWZpZWQNCmJlY2F1c2UgdGhlIGNvb3JkaW5hdGVzIGFyZSBjZW50ZXJlZCBh
dCAoMCwgMCkgaW4gdGhlIG1pZGRsZSBvZiB0aGUNCnNjcmVlbiBhbmQgaXQg
dXNlcyBmYW1pbGlhciBjb29yZGluYXRlIG9yaWVudGF0aW9uLiIiIg0KDQoj
IEknbSB0cnlpbmcgdG8gbWFrZSB0aGlzIGltcG9ydCBzYWZlLg0KDQppbXBv
cnQgVGtpbnRlcg0KDQpjbGFzcyBHcmFwaGljczoNCiAgICBkZWYgX19pbml0
X18oc2VsZiwgcm9vdCk6DQogICAgICAgIHNlbGYuX3Jvb3QgPSByb290DQog
ICAgICAgIHNlbGYuX3hwb3MsIHNlbGYuX3lwb3MgPSAwLCAwDQogICAgICAg
IHNlbGYuX3dpZHRoID0gNDAwDQogICAgICAgIHNlbGYuX2hlaWdodCA9IDQw
MA0KICAgICAgICBzZWxmLl9yZ2IgPSAnIzAwMDAwMCcgICMgRGVmYXVsdCBz
aG91bGQgYmUgYmxhY2sNCiAgICAgICAgc2VsZi5fY2FudmFzID0gVGtpbnRl
ci5DYW52YXMoc2VsZi5fcm9vdCwgd2lkdGg9c2VsZi5fd2lkdGgsDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1zZWxm
Ll9oZWlnaHQsIGJnPSd3aGl0ZScpDQogICAgICAgIHNlbGYuX2NhbnZhcy5w
YWNrKCkNCiAgICAgICAgc2VsZi5jbGVhckdyYXBoaWNzKCkNCg0KICAgIGRl
ZiBjbGVhckdyYXBoaWNzKHNlbGYpOg0KICAgICAgICAiIiIiQ2xlYXIgdGhl
IHNjcmVlbiBvZiBhbGwgZHJhd2luZ3MuIiIiDQogICAgICAgIGZvciBpZCBp
biBzZWxmLl9jYW52YXMuZmluZF9hbGwoKToNCiAgICAgICAgICAgIHNlbGYu
X2NhbnZhcy5kZWxldGUoaWQpDQoNCiAgICBkZWYgcG9zaXRpb25QZW4oc2Vs
ZiwgeCwgeSk6DQogICAgICAgICIiIk1vdmUgdGhlIHBlbiB0byB0aGUgc3Bl
Y2lmaWMgcG9zaXRpb24uIiIiDQogICAgICAgIHNlbGYuX3hwb3MsIHNlbGYu
X3lwb3MgPSB4LCB5DQoNCiAgICBkZWYgZHJhd0xpbmVUbyhzZWxmLCB4LCB5
KToNCiAgICAgICAgIiIiRHJhdyB0aGUgbGluZSBmcm9tIHRoZSBjdXJyZW50
IHBvc2l0aW9uIHRvICh4LCB5KS4NCiAgICAgICAgQXMgYSBzaWRlIGVmZmVj
dCwgdGhlIGN1cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQog
ICAgICAgIHgxLCB5MSA9IHNlbGYuY29udmVydENvb3JkKHNlbGYuX3hwb3Ms
IHNlbGYuX3lwb3MpDQogICAgICAgIHgyLCB5MiA9IHNlbGYuY29udmVydENv
b3JkKHgsIHkpDQogICAgICAgIHNlbGYuX2NhbnZhcy5jcmVhdGVfbGluZSh4
MSwgeTEsIHgyLCB5MiwgZmlsbD1zZWxmLl9yZ2IpDQogICAgICAgIHNlbGYu
cG9zaXRpb25QZW4oeCwgeSkNCg0KICAgIGRlZiBkcmF3TGluZShzZWxmLCB4
MSwgeTEsIHgyLCB5Mik6DQogICAgICAgICIiIkRyYXcgYSBsaW5lIGZyb20g
KHgxLCB5MSkgdG8gKHgyLCB5MikuICBBcyBhIHNpZGUgZWZmZWN0LA0KICAg
ICAgICB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVzICh4MiwgeTIpLiIi
Ig0KICAgICAgICBzZWxmLnBvc2l0aW9uUGVuKHgxLCB5MSkNCiAgICAgICAg
c2VsZi5kcmF3TGluZVRvKHgyLCB5MikNCg0KICAgIGRlZiBkcmF3UG9pbnQo
c2VsZiwgeCwgeSk6DQogICAgICAgICIiIkRyYXcgYSBzaW5nbGUgcG9pbnQg
YXQgKHgsIHkpLiAgQXMgYSBzaWRlIGVmZmVjdCwNCiAgICAgICAgdGhlIGN1
cnJlbnQgcG9zaXRpb24gYmVjb21lcyAoeCwgeSkuIiIiDQogICAgICAgIHNl
bGYucG9zaXRpb25QZW4oeDEsIHkxKQ0KICAgICAgICB4MSwgeTEgPSBzZWxm
LmNvbnZlcnRDb29yZCh4LCB5KQ0KICAgICAgICBzZWxmLl9jYW52YXMuY3Jl
YXRlX292YWwoeDEsIHkxLCB4MSwgeTEsIG91dGxpbmU9c2VsZi5fcmdiKQ0K
DQogICAgZGVmIGNsZWFyUG9pbnQoc2VsZiwgeCwgeSk6DQogICAgICAgICIi
IkNsZWFycyBhIHNpbmdsZSBwb2ludCBhdCAoeCwgeSkuICBBcyBhIHNpZGUg
ZWZmZWN0LA0KICAgICAgICB0aGUgY3VycmVudCBwb3NpdGlvbiBiZWNvbWVz
ICh4LCB5KS4iIiINCiAgICAgICAgc2VsZi5wb3NpdGlvblBlbih4MSwgeTEp
DQogICAgICAgIGJnY29sb3IgPSBzZWxmLl9jYW52YXMuY2dldCgnYmcnKQ0K
ICAgICAgICB4MSwgeTEgPSBzZWxmLmNvbnZlcnRDb29yZCh4LCB5KQ0KICAg
ICAgICBzZWxmLl9jYW52YXMuY3JlYXRlX292YWwoeDEsIHkxLCB4MSwgeTEs
IG91dGxpbmU9Ymdjb2xvcikNCiAgICANCiAgICBkZWYgZ3JhcGhpY3NUZXh0
KHNlbGYsIG1zZywgeCwgeSk6DQogICAgICAgICIiIldyaXRlcyBhIGxpbmUg
b2YgdGV4dCwgbGVmdCBqdXN0aWZlZCBmcm9tICh4LCB5KS4iIiINCiAgICAg
ICAgeDEsIHkxID0gc2VsZi5jb252ZXJ0Q29vcmQoeCwgeSkNCiAgICAgICAg
c2VsZi5fY2FudmFzLmNyZWF0ZV90ZXh0KHgxLCB5MSwgdGV4dD1tc2csIGZp
bGw9c2VsZi5fcmdiKQ0KICAgIA0KICAgIGRlZiBzZXRSR0JDb2xvcihzZWxm
LCByLCBnLCBiKToNCiAgICAgICAgIiIiQ2hhbmdlcyB0aGUgY3VycmVudCBj
b2xvciB0byAociwgZywgYiksIHdoZXJlDQogICAgICAgIGVhY2ggY29tcG9u
ZW50IGlzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuIiIiDQogICAgICAg
IHNlbGYuX3JnYiA9ICcjJTAyWCUwMlglMDJYJyAlIChyLCBnLCBiKQ0KDQog
ICAgZGVmIGNvbnZlcnRDb29yZChzZWxmLCB4LCB5KToNCiAgICAgICAgbmV3
eCA9IHNlbGYuX3dpZHRoLzIgKyB4DQogICAgICAgIG5ld3kgPSBzZWxmLl9o
ZWlnaHQvMiAtIHkNCiAgICAgICAgcmV0dXJuIG5ld3gsIG5ld3kNCg0KDQoN
Cg0KIyMjIEhlcmUgYXJlIHNvbWUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQgdmFy
aWFibGVzIHRvIG1ha2UgdGhpbmdzIGVhc2llcg0KIyMjIGZvciBhIGJlZ2lu
bmVyIHVuYWNjdXN0b21lZCB0byBPT1AuICBOb3RlOiB0aGlzIGlzIHVnbHkg
YmVjYXVzZSB3ZQ0KIyMjIG5lZWQgYW4gZXh0cmEgbGV2ZWwgb2YgaW5kaXJl
Y3Rpb24gaGVyZTogd2Ugd2FudCB0byBtYWtlICJmcm9tDQojIyMgZ3JhcGhp
Y3MgaW1wb3J0ICoiIHdvcmssIGJ1dCB0aGlzIHRha2VzIHNvbWUgc2lsbGlu
ZXNzIHRvIGdldCBpdA0KIyMjIHdvcmtpbmcgd2VsbC4gIE1pc2VyeSBvZiB0
aGUgZmV3IGZvciB0aGUgam95IG9mIHRoZSBtYW55LiAgKmdyaW4qDQoNCiMj
IE91ciBjYW52YXMgb2JqZWN0DQpfX2NhbnZhcyA9IE5vbmUNCg0KIyMgVGhl
cmUgbXVzdCBiZSBhIGJldHRlciB3YXkgdG8gd3JpdGUgdGhpcy4NCmRlZiBw
b3NpdGlvblBlbigqYXJncyk6DQogICAgdHJ5OiBhcHBseShfX3Bvc2l0aW9u
UGVuLCBhcmdzKQ0KICAgIGV4Y2VwdCBUa2ludGVyLlRjbEVycm9yOg0KICAg
ICAgICBjbGVhckdyYXBoaWNzKCkNCiAgICAgICAgYXBwbHkoX19wb3NpdGlv
blBlbiwgYXJncykNCiAgICAgICAgIA0KZGVmIGRyYXdMaW5lVG8oKmFyZ3Mp
Og0KICAgIHRyeTogYXBwbHkoX19kcmF3TGluZVRvLCBhcmdzKQ0KICAgIGV4
Y2VwdCBUa2ludGVyLlRjbEVycm9yOg0KICAgICAgICBjbGVhckdyYXBoaWNz
KCkNCiAgICAgICAgYXBwbHkoX19kcmF3TGluZVRvLCBhcmdzKQ0KICAgICAg
ICANCmRlZiBkcmF3TGluZSgqYXJncyk6DQogICAgdHJ5OiBhcHBseShfX2Ry
YXdMaW5lLCBhcmdzKQ0KICAgIGV4Y2VwdCBUa2ludGVyLlRjbEVycm9yOg0K
ICAgICAgICBjbGVhckdyYXBoaWNzKCkNCiAgICAgICAgYXBwbHkoX19kcmF3
TGluZSwgYXJncykNCg0KZGVmIGRyYXdQb2ludCgqYXJncyk6DQogICAgdHJ5
OiBhcHBseShfX2RyYXdQb2ludCwgYXJncykNCiAgICBleGNlcHQgVGtpbnRl
ci5UY2xFcnJvcjoNCiAgICAgICAgY2xlYXJHcmFwaGljcygpDQogICAgICAg
IGFwcGx5KF9fZHJhd1BvaW50LCBhcmdzKQ0KDQpkZWYgY2xlYXJQb2ludCgq
YXJncyk6DQogICAgdHJ5OiBhcHBseShfX2NsZWFyUG9pbnQsIGFyZ3MpDQog
ICAgZXhjZXB0IFRraW50ZXIuVGNsRXJyb3I6DQogICAgICAgIGNsZWFyR3Jh
cGhpY3MoKQ0KICAgICAgICBhcHBseShfX2NsZWFyUG9pbnQsIGFyZ3MpDQoN
CmRlZiBncmFwaGljc1RleHQoKmFyZ3MpOg0KICAgIHRyeTogYXBwbHkoX19n
cmFwaGljc1RleHQsIGFyZ3MpDQogICAgZXhjZXB0IFRraW50ZXIuVGNsRXJy
b3I6DQogICAgICAgIGNsZWFyR3JhcGhpY3MoKQ0KICAgICAgICBhcHBseShf
X2dyYXBoaWNzVGV4dCwgYXJncykNCg0KZGVmIHNldFJHQkNvbG9yKCphcmdz
KToNCiAgICB0cnk6IGFwcGx5KF9fc2V0UkdCQ29sb3IsIGFyZ3MpDQogICAg
ZXhjZXB0IFRraW50ZXIuVGNsRXJyb3I6DQogICAgICAgIGNsZWFyR3JhcGhp
Y3MoKQ0KICAgICAgICBhcHBseShfX3NldFJHQkNvbG9yLCBhcmdzKQ0KDQpf
X3Bvc2l0aW9uUGVuID0gTm9uZQ0KX19kcmF3TGluZVRvID0gTm9uZQ0KX19k
cmF3TGluZSA9IE5vbmUNCl9fZHJhd1BvaW50ID0gTm9uZQ0KX19jbGVhclBv
aW50ID0gTm9uZQ0KX19ncmFwaGljc1RleHQgPSBOb25lDQpfX3NldFJHQkNv
bG9yID0gTm9uZQ0KDQoNCmRlZiBjbGVhckdyYXBoaWNzKCk6DQogICAgX19y
ZXNldEdyYXBoaWNzKCkNCiAgICBfX3Jlc2V0RnVuY3Rpb25zKCkNCiAgICBf
X2NhbnZhcy5jbGVhckdyYXBoaWNzKCkNCg0KDQpkZWYgX19yZXNldEdyYXBo
aWNzKCk6DQogICAgZ2xvYmFsIF9fY2FudmFzDQogICAgaWYgVGtpbnRlci5f
ZGVmYXVsdF9yb290ID09IE5vbmU6DQogICAgICAgIFRraW50ZXIuX2RlZmF1
bHRfcm9vdCA9IFRraW50ZXIuVGsoKQ0KICAgICAgICBfX2NhbnZhcyA9IE5v
bmUNCiAgICBpZiBfX2NhbnZhcyA9PSBOb25lOg0KICAgICAgICBfX2NhbnZh
cyA9IEdyYXBoaWNzKFRraW50ZXIuX2RlZmF1bHRfcm9vdCkNCg0KDQpkZWYg
X19yZXNldEZ1bmN0aW9ucygpOg0KICAgIGdsb2JhbCBfX2NhbnZhcw0KICAg
IGdsb2JhbCBfX3Bvc2l0aW9uUGVuLCBfX2RyYXdMaW5lVG8sIF9fZHJhd0xp
bmUNCiAgICBnbG9iYWwgX19kcmF3UG9pbnQsIF9fY2xlYXJQb2ludCwgX19n
cmFwaGljc1RleHQsIF9fc2V0UkdCQ29sb3INCiAgICBfX3Bvc2l0aW9uUGVu
ID0gX19jYW52YXMucG9zaXRpb25QZW4NCiAgICBfX2RyYXdMaW5lVG8gPSBf
X2NhbnZhcy5kcmF3TGluZVRvDQogICAgX19kcmF3TGluZSA9IF9fY2FudmFz
LmRyYXdMaW5lDQogICAgX19kcmF3UG9pbnQgPSBfX2NhbnZhcy5kcmF3UG9p
bnQNCiAgICBfX2NsZWFyUG9pbnQgPSBfX2NhbnZhcy5jbGVhclBvaW50DQog
ICAgX19ncmFwaGljc1RleHQgPSBfX2NhbnZhcy5ncmFwaGljc1RleHQNCiAg
ICBfX3NldFJHQkNvbG9yID0gX19jYW52YXMuc2V0UkdCQ29sb3INCg0KIyMg
TGV0J3Mgc3RhcnQgdGhlIG1hZ2ljLg0KY2xlYXJHcmFwaGljcygpDQoNCg==
--545289610-1210645831-989403251=:13714--