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
Copy link
Copy Markdown
Author

sontek commented Dec 22, 2011

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
Copy link
Copy Markdown
Author

sontek commented Dec 22, 2011

It now supports python3 and windows (hopefully)

@davea
Copy link
Copy Markdown

davea commented Dec 22, 2011

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

@sontek
Copy link
Copy Markdown
Author

sontek commented Dec 22, 2011

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
Copy link
Copy Markdown

tensigh commented Dec 26, 2012

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
Copy link
Copy Markdown

chaobin commented Dec 31, 2012

That's neat man, I love it.

@sontek
Copy link
Copy Markdown
Author

sontek commented Jan 7, 2013

@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