89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
|
import sys
|
||
|
import os
|
||
|
from PIL import Image, ImageDraw, ImageFont
|
||
|
import tempfile
|
||
|
|
||
|
class Label():
|
||
|
pixels_x = 155
|
||
|
pixels_y = 106
|
||
|
bg_color = (255, 255, 255)
|
||
|
|
||
|
def __init__(self, skip_create = False):
|
||
|
me_path = os.path.dirname(__file__)
|
||
|
self.bold_font_fname = os.path.join(me_path, 'OpenSans-Bold.ttf')
|
||
|
self.regular_font_fname = os.path.join(me_path, 'OpenSans-Regular.ttf')
|
||
|
|
||
|
if not skip_create:
|
||
|
self.create()
|
||
|
|
||
|
def create(self):
|
||
|
self.img = Image.new('RGB', (self.pixels_x, self.pixels_y), color=self.bg_color)
|
||
|
|
||
|
def draw_text(self, text : str, pos_x, pos_y, color=(0,0,0), size=10, font_file=None, centered=False, scale_to_fit=False):
|
||
|
d = ImageDraw.Draw(self.img)
|
||
|
if font_file is None or font_file == 'regular':
|
||
|
font_file = self.regular_font_fname
|
||
|
elif font_file == 'bold':
|
||
|
font_file = self.bold_font_fname
|
||
|
|
||
|
font_fits = False
|
||
|
orig_size = size
|
||
|
orig_pos_x = pos_x
|
||
|
orig_pos_y = pos_y
|
||
|
while not font_fits:
|
||
|
fnt = ImageFont.truetype(font_file, size)
|
||
|
w, h = d.textsize(text, font=fnt)
|
||
|
|
||
|
if centered:
|
||
|
pos_x = orig_pos_x - w / 2
|
||
|
pos_y = orig_pos_y - h / 2
|
||
|
else:
|
||
|
pos_x = orig_pos_x
|
||
|
pos_y = orig_pos_y
|
||
|
|
||
|
if not scale_to_fit:
|
||
|
font_fits = True
|
||
|
break
|
||
|
|
||
|
if pos_x >= 0 and pos_x + w <= self.pixels_x:
|
||
|
font_fits = True
|
||
|
else:
|
||
|
size = size - 1
|
||
|
if size != orig_size:
|
||
|
print('Rescaled font to size:', size)
|
||
|
|
||
|
d.text((pos_x, pos_y), text, font=fnt, fill=color)
|
||
|
|
||
|
def save(self, fname = None):
|
||
|
"""
|
||
|
Save Label to file. If no fname is supplied, a tempfile is created and its filename is returend
|
||
|
"""
|
||
|
if self.img is None:
|
||
|
raise Exception('Must create image first')
|
||
|
|
||
|
if fname is None or fname == '':
|
||
|
fobj = tempfile.mkstemp(suffix='.png', prefix='label_', text=False)
|
||
|
with os.fdopen(fobj[0], mode="w+b") as file:
|
||
|
self.img.save(file, format='PNG')
|
||
|
fname = fobj[1]
|
||
|
else:
|
||
|
self.img.save(fname)
|
||
|
|
||
|
return fname
|
||
|
|
||
|
|
||
|
class MiceToiletLabel(Label):
|
||
|
|
||
|
pixels_x = 155
|
||
|
pixels_y = 106
|
||
|
|
||
|
def __init__(self):
|
||
|
super().__init__(skip_create=True)
|
||
|
self.create()
|
||
|
|
||
|
def put_text(self, heading, line1=None, line2=None):
|
||
|
self.draw_text(heading, self.pixels_x/2, 20, size=25, font_file='bold', centered=True, scale_to_fit=True)
|
||
|
if line1:
|
||
|
self.draw_text(line1, self.pixels_x/2, 55, size=20, centered=True, scale_to_fit=True)
|
||
|
if line2:
|
||
|
self.draw_text(line2, self.pixels_x/2, 85, size=20, centered=True, scale_to_fit=True)
|