文章目录
介绍与准备
声明
要源码请关注后留言
不用做任何商业用途
赠人玫瑰,手有余香,点个赞再走呗
Tkinter 指南
这里使用的是 Tkinter 来开发一款软件的,如果不是用 Tkinter,请移步。
首先推荐一些 Tkinter 的教程吧:
Tkinter GUI 01
Tkinter GUI 02
Tkinter GUI 03
Tkinter GUI 04
Tkinter GUI 05
Tkinter GUI 06
Tkinter GUI 07
Tkinter GUI 08
然后,是一些有用的参考资料和书籍的下载地址:
Python GUI Tkinter 参考资料
再安装如下模块;
- handright
- docx:用于打开 Word
- PIL:用于保存图像,创建手写字体模板
开发环境
这里使用 Eclipse 的 PyDev 开发我们的 GUI 应用,有关 Eclipse 的内容,可以参阅:
Eclipse 安装教程、PyDev 插件下载教程与有关设置
另外 PyDev 由于是一个插件,所以,其版本更新需要我们重新卸载、再安装。读者们下载了 PyDev 插件之后,过一阵子,就会弹出下面的一个对话框:
Word 转手写体代码
首先,我们忽略 GUI,看一下我们的 Word 转手写体代码。首先,在 Eclipse 中新建一个 Python 的项目:
主程序
首先,在我们新建的项目中,添加一个 .py 文件,如下所示:
背景图像
为了让 Word 转换起来更像是手写体,我们还要添加一个背景,这里用的背景是我们童年的回忆——猫狗本,如下所示。将这个背景图像,命名为 background_01.jpg,并放在我们项目文件的 src(需要自己新建)文件中。
字体下载与设置
首先要转换成手写体,我们需要用一个·手写体的字体,再将其加入随机扰动,来模拟手写体的效果。
大家可以从这个网站上下载一些手写体,免费的:
- 手写体下载地址
- 推荐一款瘦金体:http://www.zhaozi.cn/html/fonts/china/ruizibige/2020-05-25/26424.html
然后,同样在项目文件夹中,添加一个 font 文件夹。然后,将下载完的手写体字体,放到文件夹中。我大概是下载了这么多的手写体字体,大家可以参考一下:
主程序啦!!
之后,我们要往这个文件中,加入我们的主要程序代码,如下所示:
from PIL import Image, ImageFont
import numpy as np
from handright import Template, handwrite
from multiprocessing import Pool
import time
text = """
鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和
"""
background=Image.open(r'./src/background_01.jpg')
width, height = background.size
background = background.resize((np.int(3*width),np.int(2.5*height)),resample=Image.LANCZOS)
if __name__ == "__main__":
time_start = time.time() #计时开始
template = Template(
background=background, #选择北京
font_size=100, #选择字体大小
font=ImageFont.truetype(r".\font\瘦金简体.ttf"), #选择字体
line_spacing=150,
fill=0, # 字体“颜色”
left_margin=250, #选择字体于背景边缘的间距。
top_margin=-30,
right_margin=100,
bottom_margin=100,
word_spacing=15,
line_spacing_sigma=6, # 行间距随机扰动
font_size_sigma=1, # 字体大小随机扰动
word_spacing_sigma=3, # 字间距随机扰动
end_chars=",。;、“” ", # 防止特定字符因排版算法的自动换行而出现在行首
perturb_x_sigma=3, # 笔画横向偏移随机扰动
perturb_y_sigma=3, # 笔画纵向偏移随机扰动
perturb_theta_sigma=0.03, # 笔画旋转偏移随机扰动
)
with Pool() as p: #多线程,加快程序的运行。
images = handwrite(text, template, mapper=p.map)
for i, im in enumerate(images): #输出结果
assert isinstance(im, Image.Image)
im.save(r".\output\{}.jpg".format(i)) #将输出结果保存到路径中
time_end = time.time() #计时结束
print(time_end-time_start) #输出运行时间
这里要注意,im.save(r".\output\{}.jpg".format(i))
将手写体弄成 jpg 图片之后,就会保存到一个叫 output 的文件夹中,并以 0 开始,命名图像。这里的 output 文件夹,要事先创建好,否则报错。当然,也可以添加一条代码来防止这样的情况。这条代码是什么呢?评论区走起~~
代码测试与结果
然后,运行一下我们的代码,会跳出一下错误:
File “E:\java-2020-03\eclipse\workspace\Word2write_Principle\principle1.py”, line 7
SyntaxError: Non-UTF-8 code starting with ‘\xc4’ in file E:\java-2020-03\eclipse\workspace\Word2write_Principle\principle1.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
这是因为,我们的代码的第7句,text = """ 鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和 """
出现了中文,所以识别不出来。只要在代码的开头,加入一句 #coding=gbk
或者# -*- coding:utf-8 -*
,再次运行即可。
效果如下:
怎么样?心旷神怡对不对?除了有点东倒西歪以外,基本上是满足了我们的需求啊。大家也可以用其他字体,来体验一下效果。这里用李国夫手写体,来实验一下,效果如下:
链接 Word 文档
我们的需求是,输入一个 Word 文档,再将其转换为手写体。而不是每一次运行,都要设置 text 变量。为了实现这个目的,我们需要另外写一个程序,来读写 Word 文档。
从 Word 文档获取输入的代码
再次新建一个 .py 文件,命名为 principle2.py ,并键入如下代码:
# coding: utf-8
import docx
def read_docx(docx_path = r'./input/demo.docx'):
docStr = docx.Document(docx_path)
txt = []
for para in docStr.paragraphs: # 如果检测到 word 中有居中的,就在两边加上空格。
parStr = para.text
if_center = para.paragraph_format.alignment
if if_center:
parStr = parStr.center(48)
else:
parStr = ' ' + parStr
txt.append(parStr)
return '\n'.join(txt)
if __name__ == "__main__":
txt = read_docx()
新建一个 Word 测试文档
为了保证程序的正确运行,我们还需要在项目文件夹中,创建一个新的文件夹,命名为 input。之后,再在里面添加一个 .docx 文件,命名为 demo.docx,输入以下文字:
代码调试
之后,我们可以运行一下 principle2.py 文件,用 debug 来观察程序是否运行顺畅。首先,在 return 处设置断点,按 F11 进行调试,可以看到程序运行到断点出,停止运行。并在 Varialbe 窗口出现一些变量(右边)
我们可以直接在 Variable 窗口,点击 txt,来观察变量 txt 的取值。也可以在 command 窗口,输入变量名 txt,来观察变量的取值。结果如下:
[’ 谜题一个 ‘, ’ 鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和。’, ’ 答案是:—— 我要用自己的方式来爱你!!!’]
之后,在按一下 F5(step into吧,好像是),再按一次(共两次),就可以结束了。有关调试的内容,就不再过多说明了。
代码运行准备
测试完毕,效果可嘉。为了让上述的 txt 变量读入到 principle1.py 中,以供我们的程序使用,我们还要在 principle1.py 文件中,添加一些代码,以保证程序的运行,如下:
......
from principle2 import *
#text = """
#鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和
#"""
..