-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
executable file
·148 lines (119 loc) · 6.45 KB
/
main.py
File metadata and controls
executable file
·148 lines (119 loc) · 6.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import tkinter as tk
from paths import TurtlePathModule
class TurtleGUI:
def __init__(self, root):
self.root = root
root.title("Turtle Robot")
self.colours = ["white", "black", "red", "green", "blue", "cyan", "yellow", "magenta"]
self.colour = "black"
self.canvas = tk.Canvas(root, bg="white", height=300, width=300)
self.canvas.grid(column=0, row=0, columnspan=4)
self.colour_frame = tk.Frame(root)
self.colour_frame.grid(column=4, row=0)
self.reset()
self.add_colour_buttons()
tk.Button(root, text="↑", command=self.move_up).grid(column=0, row=1)
tk.Button(root, text="↓", command=self.move_down).grid(column=1, row=1)
tk.Button(root, text="←", command=self.move_left).grid(column=2, row=1)
tk.Button(root, text="→", command=self.move_right).grid(column=3, row=1)
tk.Button(root, text="Forward", command=self.move_forward).grid(column=4, row=1)
tk.Button(root, text="Toggle Draw", command =self.toggle_draw).grid(column=0, row=2)
tk.Button(root, text="Reset", command=self.reset).grid(column=1, row=2)
tk.Button(root, text="↰", command=self.turn_left).grid(column=2, row=2)
tk.Button(root, text="↱", command=self.turn_right).grid(column=3, row=2)
tk.Button(root, text="Backward", command=self.move_backwards).grid(column=4, row=2)
def make_turtle(self):
# Turtle Body
self.canvas.create_rectangle(self.position[0]-4, self.position[1]-4, self.position[0] + 4, self.position[1] + 4, fill='#51f07c', tag=("turtle",))
# Turtle Head
self.canvas.create_rectangle(self.position[0]-2, self.position[1]-4, self.position[0] + 2, self.position[1] - 7, fill='#51f07c', tag=("turtle", "head"))
def reset(self):
self.canvas.delete("all")
self.position = [150, 150]
self.facing = "North"
self.draw = True
self.colour = "black"
self.make_turtle()
def toggle_draw(self):
self.draw = not self.draw
def add_colour_buttons(self):
for i, colour in enumerate(self.colours):
# We have to bind the colour to x in the lambda, otherwise the "colour" variable in the lambda
# refers to the last element in the array at runtime and all of the buttons make the
# colour the same.
tk.Button(self.colour_frame, text=colour, command = lambda x = colour: self.change_colour(x)).grid(column=0, row=i)
def change_colour(self, colour):
self.colour = colour.lower()
def move_up(self):
if self.draw == True:
self.canvas.create_line(self.position[0], self.position[1], self.position[0], self.position[1] - 10, fill=self.colour, width=1)
self.canvas.move("turtle", 0, -10)
self.position[1] -= 10
def move_down(self):
if self.draw == True:
self.canvas.create_line(self.position[0], self.position[1], self.position[0], self.position[1] + 10, fill=self.colour, width=1)
self.canvas.move("turtle", 0, 10)
self.position[1] += 10
def move_left(self):
if self.draw == True:
self.canvas.create_line(self.position[0], self.position[1], self.position[0] - 10, self.position[1], fill=self.colour, width=1)
self.canvas.move("turtle", -10, 0)
self.position[0] -= 10
def move_right(self):
if self.draw == True:
self.canvas.create_line(self.position[0], self.position[1], self.position[0] + 10, self.position[1], fill=self.colour, width=1)
self.canvas.move("turtle", 10, 0)
self.position[0] += 10
def move_forward(self):
# Python 3.8 doesn't have match statements yet
# In Rust I would use a Direction Enum to pattern match against
if self.facing == "North":
self.move_up()
elif self.facing == "East":
self.move_right()
elif self.facing == "West":
self.move_left()
elif self.facing == "South":
self.move_down()
def move_backwards(self):
if self.facing == "North":
self.move_down()
elif self.facing == "East":
self.move_left()
elif self.facing == "West":
self.move_right()
elif self.facing == "South":
self.move_up()
def turn_left(self):
# Much easier to just delete the turtles head and redraw it to show rotation
self.canvas.delete("head")
if self.facing == "North":
self.canvas.create_rectangle(self.position[0] - 4, self.position[1] - 2, self.position[0] - 7, self.position[1] + 2, fill='#51f07c', tag=("turtle", "head"))
self.facing = "West"
elif self.facing == "West":
self.canvas.create_rectangle(self.position[0] - 2, self.position[1] + 4, self.position[0] + 2, self.position[1] + 7, fill='#51f07c', tag=("turtle", "head"))
self.facing = "South"
elif self.facing == "South":
self.canvas.create_rectangle(self.position[0] + 4, self.position[1] - 2, self.position[0] + 7, self.position[1] + 2, fill='#51f07c', tag=("turtle", "head"))
self.facing = "East"
elif self.facing == "East":
self.canvas.create_rectangle(self.position[0] - 2, self.position[1] - 4, self.position[0] + 2, self.position[1] - 7, fill='#51f07c', tag=("turtle", "head"))
self.facing = "North"
def turn_right(self):
self.canvas.delete("head")
if self.facing == "North":
self.canvas.create_rectangle(self.position[0] + 4, self.position[1] - 2, self.position[0] + 7, self.position[1] + 2, fill='#51f07c', tag=("turtle", "head"))
self.facing = "East"
elif self.facing == "West":
self.canvas.create_rectangle(self.position[0] - 2, self.position[1] - 4, self.position[0] + 2, self.position[1] - 7, fill='#51f07c', tag=("turtle", "head"))
self.facing = "North"
elif self.facing == "South":
self.canvas.create_rectangle(self.position[0] - 4, self.position[1] - 2, self.position[0] - 7, self.position[1] + 2, fill='#51f07c', tag=("turtle", "head"))
self.facing = "West"
elif self.facing == "East":
self.canvas.create_rectangle(self.position[0] - 2, self.position[1] + 4, self.position[0] + 2, self.position[1] + 7, fill='#51f07c', tag=("turtle", "head"))
self.facing = "South"
window = tk.Tk()
turtle_gui = TurtleGUI(window)
TurtlePathModule(turtle_gui)
window.mainloop()