Python打造一个词云制作软件

文章目录

参数字典

自从做了热榜的词云之后,就越来越觉得词云的表达力真的很强,所以合计是不是可以为WordCloud做一个界面,来更加直观地操作。

既然以WordCloud为核心,那么界面的组件自然要和WordCloud的参数意义绑定,每个参数在界面中都对应一个提示组件,比如Lable,和一个输入组件,比如Entry。此外,这些参数都是可设的,那么在对应一个组件的同时,也应该对应一个StringVar。

简单起见,现在只挑选几个必备的参数,来演示这个逻辑的实现方法

参数 说明 适用组件 参数
width 词云宽度 Spinbox 100-2000, 10
height 词云高度 Spinbox 100-2000, 10
scale 缩放 Spinbox 0.5-10, 0.1
输入文本 路径对话框
输出词云 路径对话框
font_path 字体文件路径 路径对话框

将这些参数封装成一个字典,内容如下

python 复制代码
wcDct = {
    "词云宽度" : {
        "Ctrl": ttk.Spinbox, 
        "paras" : {"from_":100, "to":2000, "increment":10},
        "default":800,
        "call" : "width"},
    "词云宽度" : {
        "Ctrl": ttk.Spinbox, 
        "paras" : {"from_":100, "to":2000, "increment":10},
        "default":450,
        "call" : "height"},
    "图像缩放" : {
        "Ctrl": ttk.Spinbox, 
        "paras" : {"from_":0.5, "to":10, "increment":0.1},
        "default":1,
        "call" : "scale"},
    "输入路径" : {"Ctrl": DialogButton},
    "输出路径" : {"Ctrl": DialogButton},
    "字体路径" : {"Ctrl": DialogButton, "call" : "font_path"},
}

其中,DialogButton是自定义的一个组件,主要包括一个按钮和一个输入框,点击按钮可以弹出文件对话框。

布局

有了这个字典,就可以据此来布局了

python 复制代码
class DrawWords(ttk.Frame):
    def __init__(self, master, **options):
        super().__init__(master, **options)
        self.pack()
        self.words = None
        self.initWidgets()
    
    def initWidgets(self):
        frm = ttk.Frame(self)
        frm.pack(side=tk.LEFT, fill=tk.Y)
        self.initPara(frm)

    def setOneSpinBox(self, frm, key):
        ttk.Label(frm, width=8, text=key).pack(side=tk.LEFT)
        v = wcDct[key]      # 组件参数
        n = v["call"]       # 调用名
        self.spins[n] = v["ctrl"](frm, **v["paras"])
        self.spins[n].set(v["default"])
        self.spins[n].pack(side=tk.LEFT)
    
    def setOneDiaButton(self, frmPara, key):
        frm = ttk.Frame(frmPara)
        frm.pack(side=tk.TOP, fill=tk.X)
        ttk.Label(frm, width=8, text=key).pack(side=tk.LEFT)
        v = wcDct[key]
        n = v["call"] if 'call' in v else key
        self.paths[n] = v["ctrl"](frm, **v['paras'])
        self.paths[n].pack(side=tk.LEFT)
        if 'default' in v:
            self.paths[n].set(v['default'])

    def initPara(self, frmPara):
        self.spins = {}
        frm = ttk.Frame(frmPara)
        frm.pack(side=tk.TOP, fill=tk.X)
        for key in ["词云宽度", "词云高度"]:
            self.setOneSpinBox(frm, key)

        self.paths = {}
        for key in ["输入路径", "输出路径", "字体路径"]:
            self.setOneDiaButton(frmPara, key)
                
        frm = ttk.Frame(frmPara)
        frm.pack(side=tk.TOP, fill=tk.X)
        ttk.Button(frm, text="输出词云", 
            command=self.genWordCloud).pack(side=tk.LEFT)

在布局过程中,对SpinBox类型的变量和DialogButton型的变量分别做了不同的处理,并且为它们分别设计了全局变量字典self.spins和self.paths,以便于调用。

布局结果如下

其中,genWordCloud用于词云输出,考虑到分词的准确性,这里仍然采用jieba进行分词,并为分词专门设计一个函数,其最终实现如下。

python 复制代码
    def splitWords(self):
        p = self.paths["输入路径"].get()
        with open(p, encoding='utf8') as f:
            text = f.read()
        words = jieba.lcut(text)
        self.words = [w for w in words if len(w)>1] # 取出长度大于1的词

    def genWordCloud(self):
        dct = {}
        for key in ['width', 'height', 'font_path']:
            if key in self.spins:
                dct[key] = int(self.spins[key].get())
            if key in self.paths:
                dct[key] = self.paths[key].get()        
        cloud = WordCloud(**dct)
        self.splitWords()
        cloud.generate(" ".join(self.words))
        p = self.paths["输出路径"].get()
        if not (p.endswith('.png') or p.endswith('.svg')):
            p = p+".png"
        cloud.to_file(p)

测试结果

最后,按照惯例,做一下测试

python 复制代码
if __name__ == "__main__":
    root = tk.Tk()
    DrawWords(root).pack(side=tk.TOP, fill=tk.BOTH)
    root.mainloop()

效果如下

相关推荐
写代码的【黑咖啡】9 小时前
Python 中的自然语言处理工具:spaCy
开发语言·python·自然语言处理
高洁019 小时前
多模态融合驱动下的具身学习机制研究
python·算法·机器学习·数据挖掘·知识图谱
dingzd959 小时前
亚马逊跨境电商“运营SOP总表”一页通:把规则、费用、合规、增长串成可执行系统
大数据·跨境电商·亚马逊·内容营销·跨境
狗都不学爬虫_9 小时前
JS逆向 -最新版 盼之(decode__1174、ssxmod_itna、ssxmod_itna2)纯算
javascript·爬虫·python·网络爬虫·wasm
乐迪信息9 小时前
乐迪信息:AI防爆摄像机的船舶船体烟火智能预警系统
大数据·网络·人工智能·算法·无人机
辰风沐阳9 小时前
git 忽略大小写(重命名文件)
大数据·git·elasticsearch
云端服务中心9 小时前
数字化采购招投标服务落地指南——政府采购代理机构实操解析
大数据·人工智能
七夜zippoe9 小时前
Dask:超越内存限制的并行计算——从任务图到分布式调度的实战指南
python·集群·task·array·dataframe·dask
serve the people9 小时前
python环境搭建 (五) Dockerfile 和 docker-compose.yml 核心作用
java·python·docker
产品经理邹继强10 小时前
VTC产品与创新篇②:产品决策仪表盘——告别优先级争吵,用三维算法驱动路线图
大数据·人工智能