1
|
|
|
import sys |
2
|
|
|
import argparse |
3
|
|
|
import time |
4
|
|
|
from os import path, getcwd |
5
|
|
|
from importlib import util as import_util |
6
|
|
|
import pkg_resources |
7
|
|
|
|
8
|
|
|
from pypen.settings import settings |
9
|
|
|
from pypen.drawing.pypen_window import PyPenWindow |
10
|
|
|
|
11
|
|
|
import pyglet |
12
|
|
|
|
13
|
|
|
_argument_parser = argparse.ArgumentParser() |
14
|
|
|
|
15
|
|
|
def space_print(msg=""): |
16
|
|
|
print() |
17
|
|
|
print(msg) |
18
|
|
|
print() |
19
|
|
|
|
20
|
|
|
def print_help(msg=""): |
21
|
|
|
global _argument_parser |
22
|
|
|
if msg: |
23
|
|
|
space_print(msg) |
24
|
|
|
|
25
|
|
|
_argument_parser.print_help(sys.stderr) |
26
|
|
|
sys.exit(0) |
27
|
|
|
|
28
|
|
|
def cli(): |
29
|
|
|
global _argument_parser |
30
|
|
|
try: |
31
|
|
|
_argument_parser = argparse.ArgumentParser(description="The PyPen CLI for managing PyPen Sketches", prog="pypen") |
32
|
|
|
_argument_parser.add_argument( |
33
|
|
|
"-i", |
34
|
|
|
"--init", |
35
|
|
|
action="store_true", |
36
|
|
|
help="Flag to create a new PyPen sketch which imports pypen and contains default functions.") |
37
|
|
|
|
38
|
|
|
_argument_parser.add_argument("filename", nargs="?", help="The name/path of your PyPen Sketch.", default="") |
39
|
|
|
_argument_parser.add_argument("-f", "--fullscreen", action="store_true") |
40
|
|
|
_argument_parser.add_argument( |
41
|
|
|
"--timeout", |
42
|
|
|
help="Timeout in milliseconds. Window will automatically close after this timeout.", |
43
|
|
|
type=float, |
44
|
|
|
required=False, |
45
|
|
|
default=0.0) |
46
|
|
|
_argument_parser.add_argument("-v", "--version", |
47
|
|
|
help="Displays the currently installed PyPen's version.", |
48
|
|
|
action="version", |
49
|
|
|
version=pkg_resources.get_distribution("pypen").version) |
50
|
|
|
|
51
|
|
|
arguments = _argument_parser.parse_args() |
52
|
|
|
|
53
|
|
|
if len(sys.argv) == 1: |
54
|
|
|
print_help("It seems like you are running the pypen command without any arguments.\nHere is some help:") |
55
|
|
|
|
56
|
|
|
if not arguments.init and not arguments.filename: |
57
|
|
|
print_help("PyPen needs a path to a sketch in order to run it!\nPlease provide a path with 'pypen <path_to_sketch>'\nor run 'pypen --init <path_to_new_sketch>' to create a new one!") |
58
|
|
|
|
59
|
|
|
if arguments.init: |
60
|
|
|
path_to_new_sketch = arguments.filename if arguments.filename else settings.default_pypen_name |
61
|
|
|
init(path_to_new_sketch) |
62
|
|
|
|
63
|
|
|
if path.splitext(arguments.filename)[1] != ".py": |
64
|
|
|
arguments.filename = "{}.py".format(arguments.filename) |
65
|
|
|
|
66
|
|
|
main(arguments) |
67
|
|
|
except argparse.ArgumentError as error: |
68
|
|
|
print(str(error)) |
69
|
|
|
sys.exit(1) |
70
|
|
|
|
71
|
|
|
|
72
|
|
|
def init(path_to_new_file): |
73
|
|
|
if path.splitext(path_to_new_file)[1] != ".py": |
74
|
|
|
path_to_new_file += ".py" |
75
|
|
|
|
76
|
|
|
pypen_path = path.join(getcwd(), path_to_new_file) |
77
|
|
|
template = "" |
78
|
|
|
|
79
|
|
|
try: |
80
|
|
|
with open(path.join(path.realpath(__file__), "..", "pypen_template.py"), "r") as template_file: |
81
|
|
|
template = template_file.read() |
82
|
|
|
except EnvironmentError: |
83
|
|
|
# In case PyPen is installed in a directory that doesn't have read access, |
84
|
|
|
# it uses the below template instead of reading the template file |
85
|
|
|
template = """from pypen import * |
86
|
|
|
|
87
|
|
|
|
88
|
|
|
def start(): |
89
|
|
|
settings.fps = 60 |
90
|
|
|
|
91
|
|
|
|
92
|
|
|
def update(): |
93
|
|
|
fill_screen("orange") |
94
|
|
|
rectangle(20, 20, 300, 400, "red") |
95
|
|
|
""" |
96
|
|
|
|
97
|
|
|
try: |
98
|
|
|
with open(pypen_path, "w") as new_file: |
99
|
|
|
new_file.writelines(template) |
100
|
|
|
except EnvironmentError: |
101
|
|
|
space_print("Could not create file {}\nDo you have the right permissions?".format(pypen_path)) |
102
|
|
|
sys.exit(1) |
103
|
|
|
|
104
|
|
|
space_print("'{0}' has been created!\nRun it using 'pypen {0}'".format(path_to_new_file)) |
105
|
|
|
sys.exit(0) |
106
|
|
|
|
107
|
|
|
|
108
|
|
|
def main(arguments): |
109
|
|
|
if not arguments.init: |
110
|
|
|
try: |
111
|
|
|
file_path = path.join(getcwd(), arguments.filename) |
112
|
|
|
spec = import_util.spec_from_file_location("", file_path) |
113
|
|
|
user_sketch = import_util.module_from_spec(spec) |
114
|
|
|
spec.loader.exec_module(user_sketch) |
115
|
|
|
except FileNotFoundError: |
116
|
|
|
print() |
117
|
|
|
print(f"Hmm, PyPen can't find '{arguments.filename}'.") |
118
|
|
|
print("Are you sure that's the right path?") |
119
|
|
|
print() |
120
|
|
|
sys.exit(1) |
121
|
|
|
|
122
|
|
|
try: |
123
|
|
|
user_sketch.TIME |
|
|
|
|
124
|
|
|
user_sketch.T |
125
|
|
|
user_sketch.PI |
126
|
|
|
except AttributeError as error: |
127
|
|
|
print() |
128
|
|
|
print(f"It seems like you're not importing PyPen to your sketch '{arguments.filename}'") |
129
|
|
|
print("Import it by writing 'from pypen import *' at the very top!") |
130
|
|
|
print() |
131
|
|
|
|
132
|
|
|
print(error) |
133
|
|
|
sys.exit(1) |
134
|
|
|
|
135
|
|
|
try: |
136
|
|
|
user_sketch.start |
137
|
|
|
except AttributeError: |
138
|
|
|
user_sketch.settings._user_has_start = False |
139
|
|
|
|
140
|
|
|
try: |
141
|
|
|
user_sketch.update |
142
|
|
|
except AttributeError: |
143
|
|
|
user_sketch.settings._user_has_update = False |
144
|
|
|
|
145
|
|
|
if not user_sketch.settings._user_has_start and not user_sketch.settings._user_has_update: |
146
|
|
|
print() |
147
|
|
|
print(f"Your PyPen sketch '{arguments.filename}' appears to have neither a start() nor an update() function.") |
148
|
|
|
print("Try to add at least one of those and run again!") |
149
|
|
|
print() |
150
|
|
|
sys.exit(1) |
151
|
|
|
|
152
|
|
|
window_title = f"PyPen | {path.splitext(path.split(arguments.filename)[1])[0]}" |
153
|
|
|
pypen_window = PyPenWindow(user_sketch, window_title, arguments) |
154
|
|
|
|
155
|
|
|
pyglet.app.run() |
156
|
|
|
|
157
|
|
|
|
158
|
|
|
if __name__ == "__main__": |
159
|
|
|
cli() |
160
|
|
|
|