前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >评价生成器

评价生成器

作者头像
叶子陪你玩
发布2020-08-28 14:44:31
4K0
发布2020-08-28 14:44:31
举报
文章被收录于专栏:叶子陪你玩编程

做一个评价器——来自大树的需求。

如果有好的想法,可以留言,有时间有能力可以帮助实现你的想法。

很多老师写评价,如果没有好工具,只能通过PPT或者一些其它排版工具,复制粘贴一堆内容,还要调整大小,位置,很不方便。

学生多的话,重复的做也是一件很无聊的事情。

看了一下需要的效果。

有5个地方的内容是填写的,后面是一张背景图片。

原始背景图

要实现可以写评价的效果,其实就转化为在背景图上写文字和粘贴图片。

处理图片立马想到使用pillow库,里面有现成的写文字和粘贴图片的方法,最麻烦的就是这些内容需要定位。

需要解决的问题:

坐标定位

学生名字,课程题目,照片粘贴位置,二维码位置,评价内容坐标位置等的计算。

自适应计算

标题要居中,评价内容如何实现自动换行,如何实现图片刚好适应背景图片框。

版本一:代码操作

代码语言:javascript
复制
import matplotlib.pyplot as plt 
from PIL import Image, ImageDraw, ImageFont

font_name = ImageFont.truetype('anna.ttf', 60)
font_content = ImageFont.truetype('anna.ttf', 50)
student_name = "小花"
student_name_pos=(140,400)

work_name = "《蒸汽火车》"
work_name_pos_y = 1140

evaluate_info = """本次课题让孩子了解到火车的发展历史,学习了蒸汽火车的连杆机构。本次课程是宝贝们首次的合作课题,大家积极交流自己的想法,锻炼了宝贝们的团队合作能力。"""
evaluate_info_pos = (50, 1240)
line_words = int((1080-50*2)//50)
lines = len(evaluate_info)//line_words+1
new_evaluate_info=""
for line in range(lines):
    new_evaluate_info += evaluate_info[line*line_words:(line+1)*line_words]
    new_evaluate_info +="\n"
print(new_evaluate_info)
bg_img = "图片1.png"
bg_img_x=(1080,1920)

work_img = "学生.png"
work_img_pos=(110,500) #970-100,1080-500

qr_code_img = "code.png"
qr_code_img_size=(200,200)
qr_code_img_pos = (860, 1700)

bg_temp = Image.open(bg_img)
W,H=bg_temp.size
work_img_temp = Image.open(work_img).resize((870,580))
qr_code_img_temp = Image.open(qr_code_img).resize((200,200))
draw = ImageDraw.Draw(bg_temp)
draw.text(student_name_pos, student_name, fill=(0, 0, 0), font=font_name)
bg_temp.paste(work_img_temp,work_img_pos)
w, h = draw.textsize(work_name,font=font_name)
draw.text(((W-w)/2, work_name_pos_y), work_name, fill=(0, 0, 0), font=font_name)
draw.text(evaluate_info_pos, new_evaluate_info, fill=(0, 0, 0), font=font_content)
bg_temp.paste(qr_code_img_temp, qr_code_img_pos)

bg_temp.save("评价.png")
plt.imshow(bg_temp)
plt.show()

版本二:界面操作

代码语言:javascript
复制
from ui_evaluate import Ui_Evaluate
from PySide2.QtWidgets import *
import requests
import sys
from PIL import Image, ImageDraw, ImageFont

class Evaluate(QMainWindow, Ui_Evaluate):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()
        #绑定查询按钮
        self.pbtn_img.clicked.connect(self.select_img)
        self.pbtn_evaluate.clicked.connect(self.process_img)

    def select_img(self):
        self.file_path = QFileDialog.getOpenFileName(self,"图片选择",filter=("*.jpg *.png"))[0]
        self.lb_img_info.setText(self.file_path)

    def process_img(self):
        try:
            font_name = ImageFont.truetype('anna.ttf', 60)
            font_content = ImageFont.truetype('anna.ttf', 50)
            student_name = self.l_name.text()
            student_name_pos = (140, 400)

            work_name = self.l_work_name.text()
            work_name_pos_y = 1140

            evaluate_info = self.text_evaluate.toPlainText()
            evaluate_info_pos = (50, 1240)
            line_words = int((1080-50*2)//50)
            lines = len(evaluate_info)//line_words+1
            new_evaluate_info = ""
            for line in range(lines):
                new_evaluate_info += evaluate_info[line*line_words:(line+1)*line_words]
                new_evaluate_info += "\n"
                    
            bg_img = "图片1.png"
            bg_img_x = (1080, 1920)


            work_img = self.file_path
            work_img_pos = (110, 500)  # 970-100,1080-500

            qr_code_img = "code.png"
            qr_code_img_size = (200, 200)
            qr_code_img_pos = (860, 1700)

            bg_temp = Image.open(bg_img)
            W, H = bg_temp.size
            work_img_temp = Image.open(work_img).resize((870, 580))
            qr_code_img_temp = Image.open(qr_code_img).resize((200, 200))
            
            draw = ImageDraw.Draw(bg_temp)
            draw.text(student_name_pos, student_name, fill=(0, 0, 0), font=font_name)
            bg_temp.paste(work_img_temp, work_img_pos)
            w, h = draw.textsize(work_name, font=font_name)
            draw.text(((W-w)/2, work_name_pos_y), work_name,
                    fill=(0, 0, 0), font=font_name)
            draw.text(evaluate_info_pos, new_evaluate_info,
                    fill=(0, 0, 0), font=font_content)
            bg_temp.paste(qr_code_img_temp, qr_code_img_pos)

            bg_temp.save("评价.png")
            QMessageBox.information(self, "提示", "评价图片完成")
        except:
            QMessageBox.information(self, "提示", "缺少内容未填写")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Evaluate()
    sys.exit(app.exec_())

注:

版本一:安装对应的库直接就可以运行,中文的还需要字体文件,可以自己找一个喜欢的字体;

版本二 :同样安装对应的库,如果需要界面可以链接获取。

https://shimo.im/docs/QtCG8kKqXGQxtqgk

改进拓展方向:

可实现不同模板,文字图片位置不同,可以上传多张图片,支持手机操作。

如果有好的想法,可以留言哦,一起交流。

(全文完)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档