# -*- coding: utf-8 -*- from functools import wraps import time import io import qrcode from docx.shared import RGBColor from base64 import b64decode import datetime import matplotlib.pyplot as plt plt.switch_backend('Agg') from io import BytesIO from tools.loglog import logger, log_err_e from docx import Document from docx.shared import Inches, Cm from threading import Lock from config.read_config import address lock = Lock() width_cm, height_cm = 5.4, 3 width_in = width_cm height_in = height_cm plt.figure(figsize=(width_in, height_in)) def hex_to_rgb(hex_color: str): hex_color = hex_color.lstrip('#') return RGBColor(int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16)) def rgb_to_hex(r, g, b): return '{:02x}{:02x}{:02x}'.format(r, g, b) def is_base64(text): try: image_bytes = b64decode(text) return image_bytes except Exception: return False def time_use(fn): @wraps(fn) def cc(*args, **kwargs): f_time = time.time() res = fn(*args, **kwargs) cha = round(time.time() - f_time, 3) if cha > 0.3: print(f'函数:{fn.__name__} 一共用时', cha, '秒') return res return cc def qrcode_maker(id_text=None, full_url=None) -> BytesIO: """ :param id_text: id_text 提供id,二维码地址是春笋筛查表的地址;http://dcjxb.yunzhixue.cn/link?type=scanpage&id=999; :param full_url: 如果提供,直接使用这个文本来生成二维码的地址 :return: 二维码图的IO对象,记得关闭 """ text = f"{address}/link?type=scanpage&id={id_text}" if full_url: text = full_url qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=12, border=4, ) qr.add_data(text) qr.make(fit=True) img = qr.make_image(fill_color="black", back_color="white") img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='PNG') img_byte_arr.seek(0) return img_byte_arr def get_weekday(): today = datetime.date.today() weekday_index = today.weekday() weekdays_chinese = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'] weekday_chinese = weekdays_chinese[weekday_index] return weekday_chinese def make_chart(x_axis_data, y_axis_datas, title, sub_title_list, x_axis_label=None, y_axis_label=None): """ :param sub_title_list: 小标题集合,放在右上角,用来标记每个y轴的数据标题 :param y_axis_label:Y轴文本 :param x_axis_label:X轴文本 :param title:图标标题 :param x_axis_data: X数据列表,单列表数据,一般就日期。 :param y_axis_datas: Y数据列表[合集],是个大列表。因为可能会有多个y线 :return: """ x_len = len(x_axis_data) image_io = BytesIO() font1 = {'family': 'SimSun', 'weight': 'normal', 'size': 14} plt.rc('font', **font1) plt.rcParams["axes.unicode_minus"] = False try: for y in y_axis_datas: if len(y) != x_len: logger.error("x轴的y轴的数据个数不一致") plt.plot(x_axis_data, y, marker='o', label="zxs") plt.title(title) if x_axis_label: plt.xlabel(x_axis_label) if y_axis_label: plt.ylabel(y_axis_label) plt.grid(True) for index, sub_title in enumerate(sub_title_list): plt.text(0.95, 0.9 - index * 0.15, sub_title, transform=plt.gca().transAxes, fontsize=10, va='top', ha='right', backgroundcolor='w') with lock: plt.savefig(image_io, format='png', bbox_inches='tight') image_io.seek(0) return image_io except Exception as e: log_err_e(e, "折线图生成错误") image_io.close() return None if __name__ == '__main__': t = time.time() io = qrcode_maker('', "http://111.231.167.191:8001/mp3") with open("1.jpg", 'wb') as f: f.write(io.read()) print(time.time() - t)