Skip to content

Instantly share code, notes, and snippets.

@hhsprings
Last active April 11, 2021 14:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hhsprings/2cae971f80f1e931f3ba34beb1c37f9d to your computer and use it in GitHub Desktop.
Save hhsprings/2cae971f80f1e931f3ba34beb1c37f9d to your computer and use it in GitHub Desktop.
世界一おバカな curses サンプル。デジタル時計。要: pillow(, windows-curses)
# -*- coding: utf-8 -*-
import sys
import time
from datetime import datetime, timedelta
from PIL import Image, ImageDraw, ImageFont
import curses
class _Main(object):
def __init__(self, fontname, fontsize, beep_after):
fnt = ImageFont.truetype(fontname, fontsize)
self._bark_t = datetime(1970, 1, 1)
if beep_after:
self._bark_t = datetime.now() + timedelta(seconds=beep_after)
chars = [str(i) for i in range(10)] + [":", ".", " "]
self._glyph = {}
for c in chars:
img = Image.new("L", (1, 1)) # temp to calculate size
draw = ImageDraw.Draw(img)
img = img.resize(draw.textsize(c, fnt)) # re-create
draw = ImageDraw.Draw(img)
draw.text((0, 0), c, font=fnt, fill=255)
_PAL = [" ", "■"]
_NLT = ["\n", ""]
self._glyph[c] = "".join([
(_PAL[not v] + _NLT[bool((i + 1) % img.width)])
for i, v in enumerate(img.getdata())]).strip().split("\n")
def run(self):
curses.wrapper(self._main)
def _main(self, stdscr):
stdscr.timeout(0)
#curses.use_default_colors()
#curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_RED)
curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE)
curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_GREEN)
curses.init_pair(4, curses.COLOR_RED, curses.COLOR_BLUE)
while True:
kc = stdscr.getch()
if kc in (ord('q'), ord('Q')):
break
stdscr.clear()
now = datetime.now()
ts = now.strftime("%H:%M.%S")
clr = 1
r = (now - self._bark_t).total_seconds()
if 0 < r and r < 3:
curses.beep()
clr = 4
elif ts[-5:] == "00.00":
clr = 3
elif ts[-2:] == "00":
clr = 2
b = curses.A_BOLD if int(ts[-1]) % 2 == 0 else 0
col = 0
for c in ts:
g = self._glyph[c]
for i in range(len(g)):
stdscr.addstr(
i, col, g[i],
curses.color_pair(clr) | b)
col += max([len(g[i]) for i in range(len(g))])
time.sleep(0.1)
stdscr.refresh()
if __name__ == '__main__':
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("--fontfile", default="comic.ttf")
ap.add_argument("--fontsize", type=int, default=46)
ap.add_argument("--beep_after", type=int)
args = ap.parse_args()
_Main(args.fontfile, args.fontsize, args.beep_after).run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment