Skip to content

Instantly share code, notes, and snippets.

@astynax
Last active December 8, 2020 15:22
Show Gist options
  • Save astynax/6520331 to your computer and use it in GitHub Desktop.
Save astynax/6520331 to your computer and use it in GitHub Desktop.
import tkinter as tk
import greenlet
from random import randint, choice
MAX_X, MAX_Y = 800, 600
def scheduler(tasks, max_ticks=None):
tasks = list(tasks)
def scheduler_task(parent_tick=None):
parent = greenlet.getcurrent().parent
tick = 0
while tasks and (max_ticks and tick < max_ticks if max_ticks else True):
parent.switch()
for t in tasks[:]:
t.switch(tick)
if t.dead:
tasks.remove(t)
tick += 1
sched = greenlet.greenlet(scheduler_task)
for t in tasks:
t.parent = sched
return sched
def circle_task(canvas):
def task(tick):
parent = greenlet.getcurrent().parent
x = randint(0, MAX_X - 10)
y = randint(0, MAX_Y - 10)
color = choice(["red", "green", "blue", "purple"])
dx, dy = choice([(1, 1), (-1, 1), (-1, -1), (1, -1)])
dx *= randint(5, 20)
dy *= randint(5, 20)
shape_id = canvas.create_oval(x, y, x + 10, y + 10, fill=color)
while True:
try:
parent.switch()
except greenlet.GreenletExit:
canvas.delete(shape_id)
break
new_x = x + dx
new_y = y + dy
if MAX_X < new_x or new_x < 0:
dx = -dx
if MAX_Y < new_y or new_y < 0:
dy = -dy
x = new_x
y = new_y
canvas.move(shape_id, dx, dy)
return greenlet.greenlet(task)
def update_task(canvas):
def task(tick):
parent = greenlet.getcurrent().parent
while True:
parent.switch()
canvas.update()
return greenlet.greenlet(task)
if __name__ == '__main__':
import sys
num_of_shapes = int((sys.argv[1:] or ["5"])[0])
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
canvas = tk.Canvas(frame, width=MAX_X, height=MAX_Y, bg="black")
canvas.pack()
sched = scheduler(
[circle_task(canvas) for _ in range(num_of_shapes)] +
[update_task(canvas)]
)
def update():
if not sched.dead:
sched.switch()
root.after(50, update)
update()
def key_handler(event):
if event.keysym == 'Escape':
sched.throw(greenlet.GreenletExit)
root.quit()
root.bind_all('<Key>', key_handler)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment