Skip to content

Commit fe37b0e

Browse files
authored
Merge pull request #115 from bittner/feature/rename-src-pythonturtle-application
Rename src/ -> pythonturtle/, pythonturtle.py -> application.py
2 parents e1eaa1e + 8ec0859 commit fe37b0e

29 files changed

+137
-166
lines changed
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,12 @@
22
An educational environment for learning Python, suitable for beginners
33
and children. Inspired by LOGO.
44
5-
Call `run()` to run it.
6-
75
PythonTurtle aims to be the most low-threshold way for learning or
86
teaching Python. The user is given command of an interactive Python
97
shell, similar to IDLE, and is able to use Python functions to move a
108
turtle that is displayed on the screen. An illustrated help screen
119
demonstrates how to move the turtle and introduces the student to the
1210
basics of Python programming.
1311
"""
14-
15-
from pythonturtle import run
16-
17-
if __name__ == "__main__":
18-
run()
12+
__version__ = '0.3.0'
13+
__url__ = 'http://pythonturtle.org'

pythonturtle/__main__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""
2+
Main entry point for executing the PythonTurtle application.
3+
"""
4+
from .application import run
5+
6+
if __name__ == "__main__":
7+
run()
Lines changed: 10 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,13 @@
1111
import wx.lib.buttons
1212
import wx.lib.scrolledpanel
1313

14-
import homedirectory
15-
import shelltoprocess
16-
import turtleprocess
17-
import turtlewidget
14+
import pythonturtle
1815

19-
from customscrolledpanel import CustomScrolledPanel
20-
from helpers import from_resource_folder
21-
22-
__version__ = "0.2.2018"
23-
24-
homedirectory.do()
16+
from . import helppages
17+
from . import shelltoprocess
18+
from . import turtleprocess
19+
from . import turtlewidget
20+
from .misc.helpers import from_resource_folder
2521

2622

2723
class ApplicationWindow(wx.Frame):
@@ -148,24 +144,8 @@ def give_focus_to_selected_page(event=None):
148144
self.help_notebook.Bind(wx.EVT_CHILD_FOCUS,
149145
give_focus_to_selected_page)
150146

151-
self.help_images_list = [
152-
["Level 1", from_resource_folder("help1.png")],
153-
["Level 2", from_resource_folder("help2.png")],
154-
["Level 3", from_resource_folder("help3.png")],
155-
["Level 4", from_resource_folder("help4.png")]]
156-
157-
self.help_pages = [HelpPage(parent=self.help_notebook,
158-
bitmap=wx.Bitmap(bitmap_file),
159-
caption=caption)
160-
for [caption, bitmap_file]
161-
in self.help_images_list]
162-
163-
for page in self.help_pages:
164-
try:
165-
# avoid TypeError: Required argument 'text' in wxPython > 2.9
166-
self.help_notebook.AddPage(page, text=page.caption)
167-
except TypeError:
168-
self.help_notebook.AddPage(page, caption=page.caption)
147+
for page in helppages.page_list(parent=self.help_notebook):
148+
self.help_notebook.AddPage(page, caption=page.caption)
169149

170150
self.help_close_button_panel = wx.Panel(parent=self.help_screen)
171151
self.help_screen_sizer = wx.BoxSizer(wx.VERTICAL)
@@ -222,34 +202,18 @@ def init_about_dialog_info(self):
222202
info.SetLicence(license_terms)
223203
info.SetCopyright(license_terms.split(os.linesep)[0])
224204
info.SetName("PythonTurtle")
225-
info.SetVersion(__version__)
226-
info.SetWebSite("http://pythonturtle.org")
205+
info.SetVersion(pythonturtle.__version__)
206+
info.SetWebSite(pythonturtle.__url__)
227207
info.SetDevelopers(developer_list)
228208
info.SetIcon(wx.Icon(from_resource_folder("turtle.png")))
229209

230210
def on_about(self, event=None):
231211
wx.adv.AboutBox(self.about_dialog_info, self)
232212

233213

234-
class HelpPage(CustomScrolledPanel):
235-
def __init__(self, parent, bitmap, caption):
236-
CustomScrolledPanel.__init__(self, parent=parent, id=-1)
237-
self.SetupScrolling()
238-
self.sizer = wx.BoxSizer(wx.VERTICAL)
239-
self.static_bitmap = wx.StaticBitmap(self, -1, bitmap)
240-
self.sizer.Add(self.static_bitmap, 1, wx.EXPAND)
241-
self.SetSizer(self.sizer)
242-
self.SetVirtualSize(self.static_bitmap.GetSize())
243-
self.caption = caption
244-
245-
246214
def run():
247215
multiprocessing.freeze_support()
248216
app = wx.App()
249217
ApplicationWindow(None, -1, "PythonTurtle", size=(600, 600))
250218
# import cProfile; cProfile.run("app.MainLoop()")
251219
app.MainLoop()
252-
253-
254-
if __name__ == "__main__":
255-
run()

pythonturtle/helppages.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"""
2+
PythonTurtle help pages for user education.
3+
"""
4+
import wx
5+
6+
from wx.lib.scrolledpanel import ScrolledPanel
7+
8+
from .misc.helpers import from_resource_folder
9+
10+
11+
class CustomScrolledPanel(ScrolledPanel):
12+
"""
13+
A subclass of wx.lib.scrolledpanel.ScrolledPanel, which implements
14+
usage of the Home and the End keys.
15+
"""
16+
17+
def __init__(self, parent, **kwargs):
18+
super().__init__(parent, **kwargs)
19+
self.Bind(wx.EVT_KEY_DOWN, self.on_key_down)
20+
21+
def on_key_down(self, event):
22+
"""
23+
Event handler for the key-down event.
24+
"""
25+
key = event.GetKeyCode()
26+
if key in (wx.WXK_HOME, wx.WXK_NUMPAD_HOME):
27+
self.scroll_home()
28+
return
29+
elif key in (wx.WXK_END, wx.WXK_NUMPAD_END):
30+
self.scroll_end()
31+
return
32+
else:
33+
event.Skip()
34+
35+
def scroll_home(self):
36+
"""
37+
Scrolls the panel to its top.
38+
"""
39+
self.Scroll(-1, 0)
40+
41+
def scroll_end(self):
42+
"""
43+
Scrolls the panel to its bottom.
44+
"""
45+
bottom = self.GetVirtualSize()[1]
46+
self.Scroll(-1, bottom)
47+
48+
49+
class HelpPage(CustomScrolledPanel):
50+
"""
51+
A single page displaying scrollable content.
52+
"""
53+
def __init__(self, parent, bitmap, caption):
54+
super().__init__(parent=parent, id=-1)
55+
self.SetupScrolling()
56+
self.sizer = wx.BoxSizer(wx.VERTICAL)
57+
self.static_bitmap = wx.StaticBitmap(self, -1, bitmap)
58+
self.sizer.Add(self.static_bitmap, 1, wx.EXPAND)
59+
self.SetSizer(self.sizer)
60+
self.SetVirtualSize(self.static_bitmap.GetSize())
61+
self.caption = caption
62+
63+
64+
def page_list(parent=None):
65+
"""
66+
Generate and return list of help pages for being displayed.
67+
"""
68+
help_images_list = [
69+
["Level 1", from_resource_folder("help1.png")],
70+
["Level 2", from_resource_folder("help2.png")],
71+
["Level 3", from_resource_folder("help3.png")],
72+
["Level 4", from_resource_folder("help4.png")],
73+
]
74+
75+
pages = [
76+
HelpPage(parent=parent,
77+
bitmap=wx.Bitmap(bitmap_file),
78+
caption=caption)
79+
for [caption, bitmap_file] in help_images_list
80+
]
81+
82+
return pages

pythonturtle/misc/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"""
2+
Supportive modules and classes for PythonTurtle implementation details.
3+
"""
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ def from_resource_folder(filename):
3535
"""
3636
Absolute path for a file assumed to be in resources folder.
3737
"""
38-
return os.path.join('PythonTurtle.app',
39-
'Contents',
40-
'Resources',
41-
'resources',
42-
filename) if sys.platform == "darwin" \
43-
else os.path.join('resources', filename)
38+
my_location = os.path.dirname(__file__)
39+
package_location = os.path.dirname(my_location)
40+
return os.path.join(package_location, 'resources', filename)
41+
42+
43+
def log(x):
44+
"""A very simple logging function"""
45+
print(x)
46+
sys.stdout.flush()
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
"""
2-
A short module for implementing `Sleeper`. See its documentation.
2+
The Sleeper context manager class implementation.
33
"""
44
import time
55

6+
# from .helpers import log
67

7-
# def log(text): print(text); sys.stdout.flush()
88

99
class Sleeper(object):
1010
"""
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import wx
22

3-
from helpers import deg_to_rad, rad_to_deg
4-
from vector import Vector
3+
from .misc.helpers import deg_to_rad, rad_to_deg
4+
from .misc.vector import Vector
55

66
# Size of the turtle canvas. We assume no user will have a screen
77
# so big that the canvas will be bigger than this.

0 commit comments

Comments
 (0)