import math
import tkinter as tk

WIDTH = 80
HEIGHT = 40
CHARS = " .:-=+*#%@"
SCALE = 10

def get_char(value):
    value = max(-1, min(1, value))
    index = int((value + 1) / 2 * (len(CHARS) - 1))
    return CHARS[index]

root = tk.Tk()
root.title("CRT Demoscene")
canvas = tk.Canvas(root, width=WIDTH*SCALE, height=HEIGHT*SCALE, bg="black")
canvas.pack()
text_items = [[canvas.create_text(x*SCALE, y*SCALE, text=" ", anchor="nw", fill="white", font=("Courier", SCALE))
               for x in range(WIDTH)] for y in range(HEIGHT)]
t = 0

def update():
    global t
    for y in range(HEIGHT):
        for x in range(WIDTH):
            nx = (x / (WIDTH - 1)) * 2 - 1
            ny = (y / (HEIGHT - 1)) * 2 - 1
            value = math.sin(10 * (nx**2 + ny**2) - t)
            value += 0.3 * math.sin(5 * nx + 5 * ny - t * 0.5)
            canvas.itemconfig(text_items[y][x], text=get_char(value))
    t += 0.1
    root.after(50, update)

update()
root.mainloop()

