Python打造一个词云制作软件

news2024/10/12 22:29:08

文章目录

    • 参数字典
    • 布局
    • 测试结果

参数字典

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

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

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

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

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

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是自定义的一个组件,主要包括一个按钮和一个输入框,点击按钮可以弹出文件对话框。

布局

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

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进行分词,并为分词专门设计一个函数,其最终实现如下。

    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)

测试结果

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

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

效果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEO生信数据挖掘(九)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本)

第六节,我们使用结核病基因数据,做了一个数据预处理的实操案例。例子中结核类型,包括结核,潜隐进展,对照和潜隐,四个类别。第七节延续上个数据,进行了差异分析。 第八节对差异基因进行富集分析。…

王道计算机考研 操作系统学习笔记篇章一:操作系统概念

目录 操作系统的概念 操作系统的功能和目标 操作系统的特征 并发 共享 虚拟 异步 操作系统的发展和分类 三大阶段 手工操作阶段 批次处理阶段—单道批处理系统 批处理阶段—多道批处理系统 操作系统分类 分时操作系统 实时操作系统 其他操作系统 操作系统的运行机制 预备知识 …

CV计算机视觉每日开源代码Paper with code速览-2023.10.18

精华置顶 墙裂推荐!小白如何1个月系统学习CV核心知识:链接 点击CV计算机视觉,关注更多CV干货 论文已打包,点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【语义分割】IDRNet: Intervention-Driven Relation Netw…

图像检索算法 计算机竞赛

文章目录 1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例5 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 图像检索算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xff…

PlatformIO在clion和vscode上的开发和使用,机器人开发嵌入式代码

vscode PlatformIO:2020年你还在用Arduino??快开始用PlatformIO开发Esp8266/32、Arduino、STM32,十分钟亲测ESP8266 clion PlatformIO: clion platformio搭建 其他说明: 在vscode里使用platformio,可以选择开发的平台…

MySQL学习(七)——存储过程

文章目录 1. 基本语法2. 变量2.1 系统变量2.2 用户定义变量2.3 局部变量 3. 逻辑关系3.1 if3.2 参数3.3 case3.4 while3.4 repeat3.5 loop 4. 存储结构4.1 游标4.2 条件处理程序4.3 存储函数 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储…

idea dubge 详细

目录 一、概述 二、debug操作分析 1、打断点 2、运行debug模式 3、重新执行debug 4、让程序执行到下一次断点后暂停 5、让断点处的代码再加一行代码 6、停止debug程序 7、显示所有断点 8、添加断点运行的条件 9、屏蔽所有断点 10、把光标移到当前程序运行位置 11、单步跳过 12、…

leetCode 214.最短回文串 + KMP

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入:s "aacecaaa" 输出:"aaacecaaa"示例 2: 输入:s &…

【Java学习之道】JDBC API介绍与使用方法

引言 对于初学者来说,数据库编程可能听起来有些复杂,但实际上,只要你掌握了JDBC(Java Database Connectivity)API,就可以轻松地连接和操作数据库。本章将为你详细介绍JDBC API的概念、使用方法以及一些实际…

2023年信息院学生科协第二次硬件培训

2023年信息院学生科协第二次硬件培训 前言一、51单片机简介1、什么是单片机2、主流单片机及其编程语言3、单片机的应用4、单片机开发软件 二、GPIO(点亮LED)1、GPIO简介2、LED简介3、硬件设计4、软件设计 三、GPIO(独立按键)1、按…

ifndef是什么,如何使用?

引言 使用HbuilderX uni-ui模板创建的uni-app项目,main.js文件中看到有如下的注释: // #ifndef VUE3 ...... // #endif // #ifdef VUE3 ...... // #endif 相信很多没有uini-app项目开发经验的朋友,初次接触uni-app项目,可…

分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测

分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现基于LSTM-Ada…

Android 虚拟 A/B 详解(十) 判断 Virtual A/B 是否打开的 5 种办法.md

文章目录 0. 导读1. Virtual A/B 的开关1.1 编译开关1.2 编译开关的定义位置1.3 编译开关的作用 2. Virtual A/B 开关检查方法 1. 从源码判断示例 1. Broadcom 平台示例 2. Google 平台 方法 2、从编译输出判断方法 3、从 image 镜像文件判断示例 1. 从 super.img 判断示例 2. …

强化学习(reinforcement)

B站链接 https://www.bilibili.com/video/BV13a4y1J7bw?p1&vd_source6f43d02eb274352809b90e8cdf744905 agent----------environment--------goal State 状态 Action 行动 Reward奖励 是一个及时的反馈 目标是一个长远的结果 Core element👇 Policy 策略…

jQuery实现简易购物车

购物车中的商品列表如下: 需求如下: (1)实现如图所示商品列表 (2)单击’移出’按钮可用删除商品 (3)单击’全选’按钮选中所有商品 (4)根据用户的选择&am…

c++学习笔记汇总

[TOC] (C学习笔记汇总) 基础认识、基础语法 类、类与类之间的关系、可调用对象、std::function类模板、c11新标准、资源管理方案RAII、指针、智能指针、引用计数、C的多态 ios、istream、iostream、fstream、sstream 模板编程: 模板编程:主要分为“泛…

uniapp 安装 u-view 组件库

u-view 组件库安装教程:https://uviewui.com/components/install.html 注:以下使用 HBuilderx 安装 u-view 2.0 版本,不适用于其它版本。 1.安装 u-view 组件库 2、注册并登录 HBuilderx 账号,点击下载 u-view 组件库。 3、点击…

[Model.py 02] 地图按比例放大的实现

要求:实现地图按比例放大 分析:考虑到地图放大过程中需要保留河流道路这些物体的相对位置关系,这里选择将河流和道路这些物体的坐标矩阵合并成terrain_matrix并对这个合并后的矩阵进行缩放处理。放大后的矩阵,根据矩阵中标记的物…

如何处理前端响应式图片?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Jenkins+vue发布项目

在Jenkins 中先创建一个任务名称 然后进行下一步,放一个项目 填写一些参数 参数1: 参数2: 参数3:参数4: 点击保存就行了 配置脚本 // git def git_url http://gitlab.xxxx.git def git_auth_id GITEE_RIVER…