DMClock

From ActiveArchives

Jump to: navigation, search

Based on libdmtx

DMClock: pygame display

Usage

usage: dmclock.py [-h] [--background BACKGROUND]
                  [--textbackground TEXTBACKGROUND]
                  [--textforeground TEXTFOREGROUND] [--fontsize FONTSIZE]
                  [--linespacing LINESPACING] [--paddingleft PADDINGLEFT]
                  [--paddingtop PADDINGTOP]
                  [message [message ...]]

Display a Data Matrix Clock with message

positional arguments:
  message               an integer for the accumulator

optional arguments:
  -h, --help            show this help message and exit
  --background BACKGROUND
                        background color (hex), default 000000
  --textbackground TEXTBACKGROUND
                        background color (hex) for text, default 000000
  --textforeground TEXTFOREGROUND
                        foreground color (hex) for text, default FFFFFF
  --fontsize FONTSIZE   font size
  --linespacing LINESPACING
                        line spacing
  --paddingleft PADDINGLEFT
                        text padding left
  --paddingtop PADDINGTOP
                        text padding top

Code

import pygame, datetime
from pydmtx import DataMatrix
import argparse
 
parser = argparse.ArgumentParser(description='Display a Data Matrix Clock with message')
parser.add_argument("message", nargs='*', help='an integer for the accumulator')
parser.add_argument("--background", default="000000", help='background color (hex), default 000000')
parser.add_argument("--textbackground", default="000000", help='background color (hex) for text, default 000000')
parser.add_argument("--textforeground", default="FFFFFF", help='foreground color (hex) for text, default FFFFFF')
parser.add_argument("--fontsize", type=int, default=56, help='font size')
parser.add_argument("--linespacing", type=int, default=10, help='line spacing')
parser.add_argument("--paddingleft", type=int, default=50, help='text padding left')
parser.add_argument("--paddingtop", type=int, default=50, help='text padding top')
args = parser.parse_args()
 
def rgb(h):
    if not h.startswith("#"):
        h = "#" + h
    n = eval('0x'+h[1:])
    return (n>>16)&0xff, (n>>8)&0xff, n&0xff
 
background = rgb(args.background)
textforeground = rgb(args.textforeground)
textbackground = rgb(args.textbackground)
 
pygame.init()
size=[1280,800]
framerate = 4
milliseconds = True
screen=pygame.display.set_mode(size, pygame.FULLSCREEN)
pygame.display.set_caption("qrclock")
clock=pygame.time.Clock()
dm_write = DataMatrix()
done=False
font = pygame.font.Font(pygame.font.get_default_font(), args.fontsize)
text_left = size[1] + args.paddingleft
text_top = args.paddingtop
usermessagelines = args.message
 
def drawlines(screen, font, lines, antialias, fg, bg, left, top, spacing=0):
    for line in lines:
        s = font.render(line, antialias, fg, bg)
        screen.blit(s, (left, top))
        top += font.get_linesize() + spacing
 
while done==False:
    for event in pygame.event.get():
        if event.type == pygame.QUIT or \
        (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
            done=True
 
    screen.fill(background)
    now = datetime.datetime.now()
    tstr = now.strftime("%Y-%m-%d %H:%M:%S")
    if milliseconds:
        ms = now.strftime("%f")
        tstr += "," + ms[:3]
 
    messagelines = usermessagelines[:]
    messagelines.extend(tstr.split())
    msg = " ".join(messagelines)
 
    dm_write.encode(msg)
    im = dm_write.image
    im = im.resize((size[1], size[1]))
#    im = im.convert("RGB")
    pyg_im = pygame.image.frombuffer(im.tostring(), im.size, im.mode)
    screen.blit(pyg_im, (0, 0))
    drawlines(screen, font, messagelines, False, textforeground, textbackground, text_left, text_top, args.linespacing)
 
    pygame.display.flip()
    clock.tick(framerate) # Limit to 30 frames per second
 
pygame.quit()
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox