Skip to content

Instantly share code, notes, and snippets.

@sontek
Created December 22, 2011 04:24
Show Gist options
  • Select an option

  • Save sontek/1508912 to your computer and use it in GitHub Desktop.

Select an option

Save sontek/1508912 to your computer and use it in GitHub Desktop.
Make your terminal snow with python
#!/usr/bin/env python
import os
import random
import time
import platform
snowflakes = {}
try:
# Windows Support
from colorama import init
init()
except ImportError:
pass
def get_terminal_size():
def ioctl_GWINSZ(fd):
try:
import fcntl
import termios
import struct
cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,
'1234'))
except:
return None
return cr
cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2)
if not cr:
try:
fd = os.open(os.ctermid(), os.O_RDONLY)
cr = ioctl_GWINSZ(fd)
os.close(fd)
except:
pass
if not cr:
try:
cr = (os.environ['LINES'], os.environ['COLUMNS'])
except:
cr = (25, 80)
return int(cr[1]), int(cr[0])
columns, rows = get_terminal_size()
def clear_screen(numlines=100):
"""Clear the console.
numlines is an optional argument used only as a fall-back.
"""
if os.name == "posix":
# Unix/Linux/MacOS/BSD/etc
os.system('clear')
elif os.name in ("nt", "dos", "ce"):
# DOS/Windows
os.system('cls')
else:
# Fallback for other operating systems.
print('\n' * rows)
def get_random_flake():
if not platform.system() == 'Windows':
try:
# python3 support
try:
cmd = unichr
except NameError:
cmd = chr
flake = cmd(random.choice(range(0x2740, 0x2749)))
return flake
except:
pass
return " *"
def move_flake(col):
if snowflakes[col][0]+1 == rows:
snowflakes[col] = [1, get_random_flake()]
else:
print("\033[%s;%sH " % (snowflakes[col][0], col))
snowflakes[col][0] += 1
print("\033[%s;%sH%s" % (snowflakes[col][0], col, snowflakes[col][1]))
print("\033[1;1H")
if __name__ == "__main__":
clear_screen()
while True:
col = random.choice(range(1, int(columns)))
# its already on the screen, move it
if col in snowflakes.keys():
move_flake(col)
else:
# otherwise put it on the screen
flake = get_random_flake()
snowflakes[col] = [1, flake]
print("\033[%s;%sH%s" % (snowflakes[col][0], col,
snowflakes[col][1]))
# key any flakes on the screen moving
for flake in snowflakes.keys():
move_flake(flake)
time.sleep(0.1)
@sontek

sontek commented Dec 22, 2011

Copy link
Copy Markdown
Author

This latest version gives you random snowflakes, if your terminal doesn't support the characters drop to the old version that uses * or modify get_random_flake to always return *

@sontek

sontek commented Dec 22, 2011

Copy link
Copy Markdown
Author

It now supports python3 and windows (hopefully)

@davea

davea commented Dec 22, 2011

Copy link
Copy Markdown

This is neat :) I forked it and added varying speeds to the snow flakes to give it a pseudo-parallax effect.

@sontek

sontek commented Dec 22, 2011

Copy link
Copy Markdown
Author

Awesome, yours looks really nice

@pavellishin

Copy link
Copy Markdown

Wasn't working for me at first, kept getting stuff like:

Traceback (most recent call last):
File "snowjob.py", line 107, in
snowflakes[col][1]))
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2747' in position 7: ordinal not in range(128)

@cengiz-io

Copy link
Copy Markdown

I forced 80x25 screen size on SL4A, replaced get_random_flake() with

def get_random_flake():
    return "*"

and this runs on Android. Thank you!

@justuswilhelm

Copy link
Copy Markdown

Very good and very nice looking. I couldn't get it to run without problems on the windows console (Python 2.7) but on Cygwin it works like a charm.

Merry Christmas!

@jermenkoo

Copy link
Copy Markdown

Works like a charm py3k @ win64. :)

@tensigh

tensigh commented Dec 26, 2012

Copy link
Copy Markdown

Doesn't work in either py3.2.1 or py 2.7 in Windows for me. I've tried a number of character sets, all I get is output like this:

[5;69H
[6;69H *
[1;1H
[14;71H
[15;71H *
[1;1H

It IS animated, though.... :)

@chaobin

chaobin commented Dec 31, 2012

Copy link
Copy Markdown

That's neat man, I love it.

@sontek

sontek commented Jan 7, 2013

Copy link
Copy Markdown
Author

@tensigh you need to install colorama for it to work in windows

@shardul-shah

Copy link
Copy Markdown

Beautiful! Nice little script mate :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment