#!/usr/bin/env python3
from turtle import Shape, Turtle, mainloop, Vec2D as Vec
from time import sleep
G = 9
class GravSys( object ) :
def __init__ ( self ) :
self .planets = [ ]
self .t = 0
self .dt = 0.01
def init( self ) :
for p in self .planets :
p.init ( )
def start( self ) :
for i in range ( 10000 ) :
self .t += self .dt
for p in self .planets :
p.step ( )
class Star( Turtle) :
def __init__ ( self , m, x, v, gravSys, shape) :
Turtle.__init__ ( self , shape= shape)
self .penup ( )
self .m = m
self .setpos ( x)
self .v = v
gravSys.planets .append ( self )
self .gravSys = gravSys
self .resizemode ( "user" )
self .pendown ( )
def init( self ) :
dt = self .gravSys .dt
self .a = self .acc ( )
self .v = self .v + 0.5 *dt*self .a
def acc( self ) :
a = Vec( 0 , 0 )
for planet in self .gravSys .planets :
if planet != self :
v = planet.pos ( ) -self .pos ( )
a += ( G*planet.m /abs ( v) **3 ) *v
return a
def step( self ) :
dt = self .gravSys .dt
self .setpos ( self .pos ( ) + dt*self .v )
if self .gravSys .planets .index ( self ) != 0 :
self .setheading ( self .towards ( self .gravSys .planets [ 0 ] ) )
self .a = self .acc ( )
self .v = self .v + dt*self .a
## create compound yellow/blue turtleshape for planets
def main( ) :
s = Turtle( )
s.reset ( )
s.getscreen ( ) .tracer ( 0 , 0 )
s.ht ( )
s.pu ( )
s.fd ( 6 )
s.lt ( 90 )
s.begin_poly ( )
s.circle ( 6 , 180 )
s.end_poly ( )
m1 = s.get_poly ( )
s.begin_poly ( )
s.circle ( 6 , 180 )
s.end_poly ( )
m2 = s.get_poly ( )
planetshape = Shape( "compound" )
planetshape.addcomponent ( m1, "orange" )
planetshape.addcomponent ( m2, "blue" )
s.getscreen ( ) .register_shape ( "planet" , planetshape)
s.getscreen ( ) .tracer ( 1 , 0 )
## setup gravitational system
gs = GravSys( )
sun = Star( 1000000 , Vec( 0 , 0 ) , Vec( 0 , -2.5 ) , gs, "circle" )
sun.color ( "yellow" )
sun.shapesize ( 1.8 )
sun.pu ( )
earth = Star( 12500 , Vec( 210 , 0 ) , Vec( 0 , 195 ) , gs, "planet" )
earth.pencolor ( "green" )
earth.shapesize ( 0.8 )
moon = Star( 1 , Vec( 220 , 0 ) , Vec( 0 , 295 ) , gs, "planet" )
moon.pencolor ( "blue" )
moon.shapesize ( 0.5 )
gs.init ( )
gs.start ( )
return "Done!"
if __name__ == '__main__' :
main( )
mainloop( )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKZnJvbSB0dXJ0bGUgaW1wb3J0IFNoYXBlLCBUdXJ0bGUsIG1haW5sb29wLCBWZWMyRCBhcyBWZWMKZnJvbSB0aW1lIGltcG9ydCBzbGVlcAoKRyA9IDkKCmNsYXNzIEdyYXZTeXMob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnBsYW5ldHMgPSBbXQogICAgICAgIHNlbGYudCA9IDAKICAgICAgICBzZWxmLmR0ID0gMC4wMQogICAgZGVmIGluaXQoc2VsZik6CiAgICAgICAgZm9yIHAgaW4gc2VsZi5wbGFuZXRzOgogICAgICAgICAgICBwLmluaXQoKQogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDAwKToKICAgICAgICAgICAgc2VsZi50ICs9IHNlbGYuZHQKICAgICAgICAgICAgZm9yIHAgaW4gc2VsZi5wbGFuZXRzOgogICAgICAgICAgICAgICAgcC5zdGVwKCkKCmNsYXNzIFN0YXIoVHVydGxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtLCB4LCB2LCBncmF2U3lzLCBzaGFwZSk6CiAgICAgICAgVHVydGxlLl9faW5pdF9fKHNlbGYsIHNoYXBlPXNoYXBlKQogICAgICAgIHNlbGYucGVudXAoKQogICAgICAgIHNlbGYubSA9IG0KICAgICAgICBzZWxmLnNldHBvcyh4KQogICAgICAgIHNlbGYudiA9IHYKICAgICAgICBncmF2U3lzLnBsYW5ldHMuYXBwZW5kKHNlbGYpCiAgICAgICAgc2VsZi5ncmF2U3lzID0gZ3JhdlN5cwogICAgICAgIHNlbGYucmVzaXplbW9kZSgidXNlciIpCiAgICAgICAgc2VsZi5wZW5kb3duKCkKICAgIGRlZiBpbml0KHNlbGYpOgogICAgICAgIGR0ID0gc2VsZi5ncmF2U3lzLmR0CiAgICAgICAgc2VsZi5hID0gc2VsZi5hY2MoKQogICAgICAgIHNlbGYudiA9IHNlbGYudiArIDAuNSpkdCpzZWxmLmEKICAgIGRlZiBhY2Moc2VsZik6CiAgICAgICAgYSA9IFZlYygwLDApCiAgICAgICAgZm9yIHBsYW5ldCBpbiBzZWxmLmdyYXZTeXMucGxhbmV0czoKICAgICAgICAgICAgaWYgcGxhbmV0ICE9IHNlbGY6CiAgICAgICAgICAgICAgICB2ID0gcGxhbmV0LnBvcygpLXNlbGYucG9zKCkKICAgICAgICAgICAgICAgIGEgKz0gKEcqcGxhbmV0Lm0vYWJzKHYpKiozKSp2CiAgICAgICAgcmV0dXJuIGEKICAgIGRlZiBzdGVwKHNlbGYpOgogICAgICAgIGR0ID0gc2VsZi5ncmF2U3lzLmR0CiAgICAgICAgc2VsZi5zZXRwb3Moc2VsZi5wb3MoKSArIGR0KnNlbGYudikKICAgICAgICBpZiBzZWxmLmdyYXZTeXMucGxhbmV0cy5pbmRleChzZWxmKSAhPSAwOgogICAgICAgICAgICBzZWxmLnNldGhlYWRpbmcoc2VsZi50b3dhcmRzKHNlbGYuZ3JhdlN5cy5wbGFuZXRzWzBdKSkKICAgICAgICBzZWxmLmEgPSBzZWxmLmFjYygpCiAgICAgICAgc2VsZi52ID0gc2VsZi52ICsgZHQqc2VsZi5hCgoKIyMgY3JlYXRlIGNvbXBvdW5kIHllbGxvdy9ibHVlIHR1cnRsZXNoYXBlIGZvciBwbGFuZXRzCmRlZiBtYWluKCk6CiAgICBzID0gVHVydGxlKCkKICAgIHMucmVzZXQoKQogICAgcy5nZXRzY3JlZW4oKS50cmFjZXIoMCwwKQogICAgcy5odCgpCiAgICBzLnB1KCkKICAgIHMuZmQoNikKICAgIHMubHQoOTApCiAgICBzLmJlZ2luX3BvbHkoKQogICAgcy5jaXJjbGUoNiwgMTgwKQogICAgcy5lbmRfcG9seSgpCiAgICBtMSA9IHMuZ2V0X3BvbHkoKQogICAgcy5iZWdpbl9wb2x5KCkKICAgIHMuY2lyY2xlKDYsMTgwKQogICAgcy5lbmRfcG9seSgpCiAgICBtMiA9IHMuZ2V0X3BvbHkoKQoKICAgIHBsYW5ldHNoYXBlID0gU2hhcGUoImNvbXBvdW5kIikKICAgIHBsYW5ldHNoYXBlLmFkZGNvbXBvbmVudChtMSwib3JhbmdlIikKICAgIHBsYW5ldHNoYXBlLmFkZGNvbXBvbmVudChtMiwiYmx1ZSIpCiAgICBzLmdldHNjcmVlbigpLnJlZ2lzdGVyX3NoYXBlKCJwbGFuZXQiLCBwbGFuZXRzaGFwZSkKICAgIHMuZ2V0c2NyZWVuKCkudHJhY2VyKDEsMCkKCiAgICAjIyBzZXR1cCBncmF2aXRhdGlvbmFsIHN5c3RlbQogICAgZ3MgPSBHcmF2U3lzKCkKICAgIHN1biA9IFN0YXIoMTAwMDAwMCwgVmVjKDAsMCksIFZlYygwLC0yLjUpLCBncywgImNpcmNsZSIpCiAgICBzdW4uY29sb3IoInllbGxvdyIpCiAgICBzdW4uc2hhcGVzaXplKDEuOCkKICAgIHN1bi5wdSgpCiAgICBlYXJ0aCA9IFN0YXIoMTI1MDAsIFZlYygyMTAsMCksIFZlYygwLDE5NSksIGdzLCAicGxhbmV0IikKICAgIGVhcnRoLnBlbmNvbG9yKCJncmVlbiIpCiAgICBlYXJ0aC5zaGFwZXNpemUoMC44KQogICAgbW9vbiA9IFN0YXIoMSwgVmVjKDIyMCwwKSwgVmVjKDAsMjk1KSwgZ3MsICJwbGFuZXQiKQogICAgbW9vbi5wZW5jb2xvcigiYmx1ZSIpCiAgICBtb29uLnNoYXBlc2l6ZSgwLjUpCiAgICBncy5pbml0KCkKICAgIGdzLnN0YXJ0KCkKICAgIHJldHVybiAiRG9uZSEiCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQogICAgbWFpbmxvb3AoKQo=
stdout
stderr
Traceback (most recent call last):
File "./prog.py", line 96, in <module>
File "./prog.py", line 55, in main
File "/usr/lib/python3.4/turtle.py", line 3812, in __init__
Turtle._screen = Screen()
File "/usr/lib/python3.4/turtle.py", line 3662, in Screen
Turtle._screen = _Screen()
File "/usr/lib/python3.4/turtle.py", line 3678, in __init__
_Screen._root = self._root = _Root()
File "/usr/lib/python3.4/turtle.py", line 434, in __init__
TK.Tk.__init__(self)
File "/usr/lib/python3.4/tkinter/__init__.py", line 1859, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
/usr/share/tcltk/tcl8.6 /usr/lib/tcl8.6 /lib/tcl8.6 /usr/library /library /tcl8.6.4/library /tcl8.6.4/library
This probably means that Tcl wasn't installed properly.