from collections.abc import Iterator from pathlib import Path from typing import Literal from PIL import Image, ImageDraw, ImageFont from .config import config class Menu: """ 生成菜单的类 """ dish_path: Path # 菜品图片的路径 menu_background: Image.Image # 菜单背景图 menu_font: ImageFont.FreeTypeFont # 菜单字体 def __init__(self, menu_type: Literal["drink", "eat", "me"]) -> None: # 菜单图片的路径 self.dish_path = Path(config.whatpic_res_path) / f"{menu_type}_pic" # 获取所有菜品的名字 self.all_dish_name = [i.stem for i in self.dish_path.iterdir()] # 菜单背景图 self.menu_background = Image.open( Path(__file__).parent / "menu_res" / "menu_bg.jpg" ) # 字体大小 self.font_size = 30 # 加载字体 self.menu_font = ImageFont.truetype( str(Path(__file__).parent / "menu_res" / "FZSJ-QINGCRJ.TTF"), self.font_size ) @property def menu_bg_size(self) -> tuple: """ 获取菜单背景图的大小 """ return self.menu_background.size # 生成迭代器用于for循环遍历所有的生成的菜单 def draw_menu(self) -> Iterator[Image.Image]: # 每个菜单的行数: 背景图高度 - 200(上下边距) // (字体大小+10(行间距)) = 菜单行数 line_num = (self.menu_bg_size[1] - 150) // (self.font_size + 10) # 总共需要合成的图片数量 img_num = len(self.all_dish_name) // line_num + 1 # 生成所有菜单的图片 for i in range(img_num): # 生成一张背景图的副本 menu_img = self.menu_background.copy() # 生成draw对象 draw = ImageDraw.Draw(menu_img) # 生成菜单的名字 for j in range(line_num): # 如果菜单名字已经全部生成完毕 if i * line_num + j >= len(self.all_dish_name): break # 生成菜单序号+名字,(居中显示) draw.text( ((self.menu_bg_size[0] - 300) // 2, 75 + j * (self.font_size + 10)), f"{i * line_num + j + 1}.{self.all_dish_name[i * line_num + j]}", font=self.menu_font, fill="black", ) yield menu_img # 测试程序