draw(vector_font, s, x, y {, fg, scale, alpha})
使用指定的 Hershey 矢量字体在显示屏上绘制文字,传入的坐标表示文字左下角的位置。可选参数 fg 用于设置文字前景色,默认值为 WHITE。scale 用于缩放文字大小,必须大于 0,可以是浮点数或整数,默认值为 1.0。alpha 的默认值为 255。
draw_len(vector_font, s {, scale})
如果使用指定字体绘制,则返回字符串的宽度(以像素为单位)。
GitHub:russhughes/st7789s3_esp_lcd/fonts/vector 中提供了 py 格式的矢量字体库,README 中包含所有字体的预览图。
也可以从 示例 lib 目录 下载转换后的 mpy 格式矢量字体库,它占用的 Flash 空间更少。
可通过 draw_len 方法获取待显示字符串的宽度,但部分矢量字体的实际高度会超过设定值。若要让文本框完全覆盖文字,需要修改相应代码以增加文本框高度。
""" BPI-Centi-S3 170x320 ST7789 显示屏 """
import st7789
import tft_config
import gotheng
import italicc
import romanc
import time
import gc
from math import ceil
"""
可使用以下默认颜色:
BLACK BLUE CYAN GREEN
MAGENTA RED YELLOW WHITE
TRANSPARENT
自定义 RGB 颜色:
color565(255,255,255)
"""
class DrawRect:
def __init__(self):
self.tft = None
self.text_y = None
self.text_x = None
self.rect_x = None
self.rect_y = None
self.rect_height = None
self.rect_width = None
def rect(self, tft, vector_font, scale, text, text_coord,
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=255):
self.tft = tft
self.rect_width = self.tft.draw_len(vector_font, text, scale)
self.rect_height = ceil(vector_font.HEIGHT * scale)
self.text_x = text_coord[0]
self.text_y = text_coord[1]
self.rect_x = ceil(self.text_x - vector_font.WIDTH * scale / 8)
self.rect_y = round(self.text_y - vector_font.HEIGHT * scale / 2 + 1)
self.tft.fill_rect(self.rect_x, self.rect_y,
self.rect_width, self.rect_height, bg, alpha_rect)
self.tft.draw(vector_font, text, self.text_x, self.text_y,
fg, scale, alpha_text)
def erase(self, bg):
buffer, _, _ = self.tft.jpg_decode(bg, self.rect_x, self.rect_y, self.rect_width, self.rect_height)
self.tft.blit_buffer(buffer, self.rect_x, self.rect_y, self.rect_width, self.rect_height)
def main():
try:
tft = tft_config.config(rotation=1)
tft.init()
jpg = 'pic_4.jpg'
tft.jpg(jpg, 0, 0)
text_x = 10
text_y = 20
text_list = [
" !\"#$%&'()*+,-./",
"0123456789:;<=>?",
"@ABCDEFGHIJKLMNO",
"PQRSTUVWXYZ[\]^_",
"`abcdefghijklmno",
"pqrstuvwxyz{|}~",
]
draw_rect_1 = DrawRect()
draw_rect_2 = DrawRect()
draw_rect_3 = DrawRect()
while True:
for i in text_list:
draw_rect_1.rect(tft, gotheng, 0.8, i, (text_x, text_y),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=20)
draw_rect_2.rect(tft, italicc, 0.8, i, (text_x, text_y+32),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=40)
draw_rect_3.rect(tft, romanc, 0.8, i, (text_x, text_y + 64),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=60)
tft.show()
time.sleep(0.5)
draw_rect_1.erase(bg=jpg)
draw_rect_2.erase(bg=jpg)
draw_rect_3.erase(bg=jpg)
gc.collect()
except BaseException as err:
err_type = err.__class__.__name__
print('Err type:', err_type)
from sys import print_exception
print_exception(err)
finally:
tft.deinit()
print("tft deinit")
main()
可通过修改 draw 方法的 scale 值控制字体大小。
""" BPI-Centi-S3 170x320 ST7789 显示屏 """
import st7789
import tft_config
import gotheng
import italicc
import romanc
import time
import gc
from math import ceil
"""
可使用以下默认颜色:
BLACK BLUE CYAN GREEN
MAGENTA RED YELLOW WHITE
TRANSPARENT
自定义 RGB 颜色:
color565(255,255,255)
"""
class DrawRect:
def __init__(self):
self.tft = None
self.text_y = None
self.text_x = None
self.rect_x = None
self.rect_y = None
self.rect_height = None
self.rect_width = None
def rect(self, tft, vector_font, scale, text, text_coord,
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=255):
self.tft = tft
self.rect_width = self.tft.draw_len(vector_font, text, scale)
self.rect_height = ceil(vector_font.HEIGHT * scale)
self.text_x = text_coord[0]
self.text_y = text_coord[1]
self.rect_x = ceil(self.text_x - vector_font.WIDTH * scale / 8)
self.rect_y = round(self.text_y - vector_font.HEIGHT * scale / 2 + 1)
self.tft.fill_rect(self.rect_x, self.rect_y,
self.rect_width, self.rect_height, bg, alpha_rect)
self.tft.draw(vector_font, text, self.text_x, self.text_y,
fg, scale, alpha_text)
def erase(self, bg):
buffer, _, _ = self.tft.jpg_decode(bg, self.rect_x, self.rect_y, self.rect_width, self.rect_height)
self.tft.blit_buffer(buffer, self.rect_x, self.rect_y, self.rect_width, self.rect_height)
def main():
try:
tft = tft_config.config(rotation=1)
tft.init()
jpg = 'pic_4.jpg'
tft.jpg(jpg, 0, 0)
text_x = 10
text_y = 20
text_list = [
"!\"#$%&'()*",
"0123456789",
"ABCDEFGHI",
"PQRSTUVWX",
"abcdefghij",
"pqrstuvwxy",
]
draw_rect_1 = DrawRect()
draw_rect_2 = DrawRect()
draw_rect_3 = DrawRect()
while True:
for i in text_list:
draw_rect_1.rect(tft, romanc, 0.5, i, (text_x, text_y),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=20)
draw_rect_2.rect(tft, romanc, 1, i, (text_x, text_y+24),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=40)
draw_rect_3.rect(tft, romanc, 1.5, i, (text_x, text_y + 64),
fg=st7789.WHITE, bg=st7789.BLACK, alpha_text=255, alpha_rect=60)
tft.show()
time.sleep(0.5)
draw_rect_1.erase(bg=jpg)
draw_rect_2.erase(bg=jpg)
draw_rect_3.erase(bg=jpg)
gc.collect()
except BaseException as err:
err_type = err.__class__.__name__
print('Err type:', err_type)
from sys import print_exception
print_exception(err)
finally:
tft.deinit()
print("tft deinit")
main()