Skip to content

Commit 723030b

Browse files
author
Philip Hansen
committed
Upload from local
Timer features start / stop button, box for setting time and a rotating turtle which makes a big red dot when time is over.
1 parent b165b7a commit 723030b

File tree

1 file changed

+147
-0
lines changed

1 file changed

+147
-0
lines changed

timer.py

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
import tkinter as tk
2+
import time, string, turtle, math
3+
4+
class Set_window(tk.Frame):
5+
def __init__(self, master=None):
6+
self.master = master
7+
self.frame = tk.Frame(self.master)
8+
self.frame.pack()
9+
10+
self.time = 0
11+
12+
self.make_label()
13+
self.make_entry()
14+
self.make_button()
15+
self.frame.pack()
16+
17+
def make_label(self):
18+
self.label = tk.Label(self.frame, font=("Arial",20), text="Minutes")
19+
self.label2 = tk.Label(self.frame, font=("Arial",20), text="Seconds")
20+
21+
self.label.grid(row=0)
22+
self.label2.grid(row=1)
23+
24+
def make_entry(self):
25+
vcmd = (self.master.register(self.validate), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
26+
self.entry = tk.Entry(self.frame, width=10, font=("Arial",20), validate="key", validatecommand=vcmd)
27+
self.entry2 = tk.Entry(self.frame, width=10, font=("Arial",20), validate="key", validatecommand=vcmd)
28+
29+
self.entry.grid(row=0, column=1)
30+
self.entry2.grid(row=1, column=1)
31+
32+
def validate(self, d, i, P, s, S, v, V, W):
33+
return S in string.digits
34+
35+
def make_button(self):
36+
self.button = tk.Button(self.frame, text="Start", width=15, font=("Arial",20), command=self.open_main)
37+
self.button2 = tk.Button(self.frame, text="Stop", width=15, font=("Arial",20), command=self.close_timer)
38+
39+
self.button.grid(row=2)
40+
self.button2.grid(row=2, column=1)
41+
42+
def open_main(self):
43+
self.calculate_time()
44+
45+
self.new_window = tk.Toplevel(self.master)
46+
self.new_window.configure(bg="orange")
47+
self.app = Main_window(self.time, self.new_window)
48+
49+
def calculate_time(self):
50+
minutes = int(self.entry.get() if self.entry.get() != "" else 0)
51+
seconds = int(self.entry2.get() if self.entry2.get() != "" else 0)
52+
53+
self.time = (minutes * 60) + seconds
54+
55+
def close_timer(self):
56+
try:
57+
self.new_window.destroy()
58+
except AttributeError:
59+
pass
60+
61+
class Main_window(tk.Frame):
62+
def __init__(self, time_to_count, master=None):
63+
self.master = master
64+
self.frame = tk.Frame(self.master)
65+
self.frame.pack()
66+
67+
self.time_to_count = time_to_count
68+
69+
self.time = int(time.time())
70+
self.calculate_end_time()
71+
self.update_timer()
72+
self.make_label()
73+
self.make_canvas()
74+
self.make_turtle()
75+
self.update()
76+
77+
def make_label(self):
78+
self.label = tk.Label(self.frame, font=("Arial",30), text=self.minutes)
79+
self.label2 = tk.Label(self.frame, font=("Arial",30), text=":")
80+
self.label3 = tk.Label(self.frame, font=("Arial",30), text=self.seconds)
81+
self.label4 = tk.Label(self.frame, font=("Arial",30), text="Minutes")
82+
self.label5 = tk.Label(self.frame, font=("Arial",30), text="Seconds")
83+
84+
self.label.grid(row=0)
85+
self.label2.grid(row=0, column=1)
86+
self.label3.grid(row=0, column=2)
87+
self.label4.grid(row=1, column=0)
88+
self.label5.grid(row=1, column=2)
89+
90+
def make_canvas(self):
91+
self.canvas = tk.Canvas(self.frame, width=500, height=500)
92+
self.canvas.grid(row=2, columnspan=3)
93+
94+
def make_turtle(self):
95+
self.turtle = turtle.RawTurtle(self.canvas)
96+
self.turtle.screen.bgcolor("orange")
97+
self.turtle.fillcolor("red")
98+
99+
self.turtle.hideturtle()
100+
self.turtle.up()
101+
self.turtle.shape("turtle")
102+
self.turtle.goto(0, 200)
103+
self.turtle.showturtle()
104+
self.turtle.down()
105+
self.turtle.begin_fill()
106+
107+
self.degrees_per_step = 360 / self.time_to_count
108+
109+
def update_timer(self):
110+
self.time = int(time.time())
111+
self.time_left = self.end_time - self.time
112+
113+
self.minutes = int(self.time_left / 60)
114+
self.seconds = self.time_left % 60
115+
116+
def calculate_end_time(self):
117+
self.end_time = self.time + self.time_to_count
118+
119+
def update_text(self):
120+
self.label.config(text=self.minutes)
121+
self.label3.config(text=self.seconds)
122+
123+
def update_turtle(self):
124+
angle = self.degrees_per_step * self.time_left
125+
x = -math.sin(math.radians(angle)) * 200
126+
y = math.cos(math.radians(angle)) * 200
127+
128+
self.turtle.goto(x, y)
129+
self.turtle.setheading(angle)
130+
131+
def update(self):
132+
if self.time_left > 0:
133+
self.update_timer()
134+
else:
135+
self.turtle.end_fill()
136+
self.update_text()
137+
self.update_turtle()
138+
self.master.after(100, self.update)
139+
140+
def main():
141+
root = tk.Tk()
142+
root.wm_title("Turtle Timer")
143+
app = Set_window(root)
144+
root.mainloop()
145+
146+
if __name__ == "__main__":
147+
main()

0 commit comments

Comments
 (0)