Skip to content

@sontek /snowjob.py
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
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
Owner

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
Owner

It now supports python3 and windows (hopefully)

@davea

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

@sontek
Owner

Awesome, yours looks really nice

@pavellishin

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)

@cengizIO

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

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

Works like a charm py3k @ win64. :)

@tensigh

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

That's neat man, I love it.

@sontek
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.