python通过tkinter制作词云图工具

news2024/11/24 13:54:53

一、基本功能

在这里插入图片描述

1.采取上传文本文档(仅支持.txt格式)的方式统计词频

2.背景图形样式可选择已经设定好的,也可选择本地上传的(支持.png .jpg .jpeg格式)

3.本地上传的图片需要进行抠图处理,并将抠图结果保存到本地

4.背景图形颜色可通过调节RGB值和十六进制颜色值的方式进行设置

5.绘制好的词云图可供预览,并且可保存到本地

二、python程序

import re
import io
import jieba
import rembg
import numpy as np
import pandas as pd
import tkinter as tk
from tkinter.filedialog import *
from tkinter.ttk import *
from PIL import Image
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
from matplotlib import pyplot as plt
from matplotlib import patches as mp
from matplotlib.path import Path
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


def openfile():
    global file_path, path1
    file_path = askopenfilename(title='打开文本文档:', filetypes=[('Text Files', '*.txt')])
    path1.set(file_path)
    print(path1.get())
    return path1


def openbackground():
    global background_path, path2
    background_path = askopenfilename(title='打开图片文件:', filetypes=[('Picture Files', '*.png *.jpg *.jpeg')])
    path2.set(background_path)
    print(path2.get())
    return path2


def input_own_bg():
    button_bg.config(state=tk.NORMAL)


def input_basic_graphic_bg():
    button_bg.config(state=tk.DISABLED)


def input_rgb():
    combobox_r.config(state=tk.NORMAL)
    combobox_g.config(state=tk.NORMAL)
    combobox_b.config(state=tk.NORMAL)
    entry3.config(state=tk.DISABLED)


def input_hex():
    combobox_r.config(state=tk.DISABLED)
    combobox_g.config(state=tk.DISABLED)
    combobox_b.config(state=tk.DISABLED)
    entry3.config(state=tk.NORMAL)


def background():
    if choice_color.get() == 1:
        hex_r = hex(r.get())[2:].upper()
        hex_g = hex(g.get())[2:].upper()
        hex_b = hex(b.get())[2:].upper()
        hex_r0 = hex_r.zfill(2)
        hex_g0 = hex_g.zfill(2)
        hex_b0 = hex_b.zfill(2)
        hexcolor = '#' + hex_r0 + hex_g0 + hex_b0
    else:
        hexcolor = '#' + hex_color.get()
    plt.close(fig=None)
    fig_bg = plt.figure(figsize=(5, 5))
    ax = fig_bg.add_subplot(111, facecolor='white')
    if choice_shape.get() == 1:  # 心形
        t = np.arange(-3, 3, 0.1)
        x = 18 * np.power(np.sin(t), 3)
        y = 16 * np.cos(t) - 4 * np.cos(2 * t) - 3 * np.cos(3 * t) - np.cos(4 * t)
        shape = plt.fill(x, y, hexcolor)[0]
        ax.add_patch(shape)
        plt.axis('equal')
        plt.axis('off')
    elif choice_shape.get() == 2:  # 矩形
        shape = mp.Rectangle(xy=(0.1, 0.2), width=0.8, height=0.6, color=hexcolor)
        ax.add_patch(shape)
        plt.axis('off')
    elif choice_shape.get() == 3:  # 正方形
        shape = mp.Rectangle(xy=(0, 0), width=1, height=1, color=hexcolor)
        ax.add_patch(shape)
        plt.axis('off')
    elif choice_shape.get() == 4:  # 圆形
        shape = mp.Circle(xy=(0.5, 0.5), radius=0.5, alpha=0.8, color=hexcolor)
        ax.add_patch(shape)
        plt.axis('off')
    elif choice_shape.get() == 5:  # 五角星
        verts = []
        for i in [0, 3, 1, 4, 2, 0]:
            verts.append((np.sin(2 * np.pi / 5 * i), np.cos(2 * np.pi / 5 * i)))
        codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY]
        path = Path(verts, codes)
        shape = mp.PathPatch(path, facecolor=hexcolor, lw=0, alpha=1)
        ax.add_patch(shape)
        plt.axis('equal')
        plt.axis('off')
    else:  # 自导入
        return background_path

    buffer = io.BytesIO()
    # if hexcolor=='#FFFFFF':
    #     fig_bg.patch.set_facecolor('black')
    canvas_bg = fig_bg.canvas
    canvas_bg.print_png(buffer)
    data = buffer.getvalue()
    buffer.write(data)
    plt.close(fig=None)
    return buffer


def check(event):
    if path1.get() and len(hex_color.get()) == 6:
        button_draw.config(state=tk.NORMAL, fg='green')
    else:
        button_draw.config(state=tk.DISABLED, fg='red')


def check_hex(hex_input):
    hex_characters = '0123456789abcdefABCDEF'
    if len(hex_input) <= 6 and all(char in hex_characters for char in hex_input):
        return True
    else:
        return False


def wordcloud():
    global button_save
    text = pd.read_csv(file_path, index_col=0, encoding='utf-8', sep='\t')
    text2 = str(text)
    text3 = re.sub("[a-zA-Z0-9'!""#$%&\'()*+,-./:;<=>?@,。?★、…【】《》:?“”‘'![\\]^_`{|}~\s]+", "", text2)
    text4 = jieba.lcut(text3)
    text5 = ' '.join(text4)
    stop_words = set()
    content = [line.strip() for line in open('stopwords.txt', 'r', encoding='utf-8').readlines()]
    stop_words.update(content)
    font = r'C:\Windows\Fonts\simhei.ttf'
    img = Image.open(background())
    img_remove = rembg.remove(img, alpha_matting=True, bgcolor=(255, 255, 255, 1))
    img_remove.save('background_remove.png')
    MASK = np.array(img_remove)
    img_col = ImageColorGenerator(MASK)
    plt.close(fig=None)
    fig = plt.figure(figsize=(5, 2.5))
    plt.subplot(121)
    wordcloud = WordCloud(background_color='white', scale=2, max_words=500, max_font_size=50, min_font_size=1, font_path=font, stopwords=stop_words, mask=MASK, mode='RGB').generate_from_text(text5)
    plt.imshow(wordcloud.recolor(color_func=img_col), alpha=1)
    plt.axis('off')
    plt.subplot(122)
    plt.imshow(img)
    plt.axis('off')
    plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)
    plt.margins(0, 0)
    canvas = FigureCanvasTkAgg(figure=fig, master=windows)
    canvas.draw()
    canvas.get_tk_widget().grid(row=4, column=0, rowspan=1, columnspan=8, padx=0, pady=15)
    button_save = tk.Button(windows, text='保存词云图', command=show)
    button_save.grid(row=5, column=0, rowspan=1, columnspan=8)


def show():
    plt.show()
    button_save.config(state=tk.DISABLED)


if __name__ == '__main__':
    windows = tk.Tk()
    windows.geometry('550x450+500+200')
    windows.resizable(width=False, height=False)
    windows.title('词云图')
    windows.iconbitmap('image.ico')

    path1 = tk.StringVar()
    tk.Label(windows, text='文件路径:').grid(row=0, column=0, pady=5, padx=2)
    entry1 = tk.Entry(windows, textvariable=path1, width=50, state=tk.DISABLED)
    entry1.grid(row=0, column=1, rowspan=1, columnspan=6, pady=5)
    tk.Button(windows, text='打开文件', command=openfile, fg='green', width=9).grid(row=0, column=7, pady=5, padx=2)

    choice_shape = tk.IntVar()
    choice_shape.set(1)
    tk.Label(windows, text='图形样式:').grid(row=1, column=0, padx=2)
    button_bg = tk.Button(windows, text='打开文件', command=openbackground, fg='green', width=9, state=tk.DISABLED)
    button_bg.grid(row=1, column=7, padx=2)
    path2 = tk.StringVar()
    entry2 = tk.Entry(windows, textvariable=path2, width=50, state=tk.DISABLED)
    entry2.grid(row=1, column=1, rowspan=1, columnspan=6)
    tk.Radiobutton(windows, text='心形', value=1, variable=choice_shape, justify=tk.LEFT, command=input_basic_graphic_bg).grid(row=2, column=1)
    tk.Radiobutton(windows, text='矩形', value=2, variable=choice_shape, justify=tk.LEFT, command=input_basic_graphic_bg).grid(row=2, column=2)
    tk.Radiobutton(windows, text='正方形', value=3, variable=choice_shape, justify=tk.LEFT, command=input_basic_graphic_bg).grid(row=2, column=3)
    tk.Radiobutton(windows, text='圆形', value=4, variable=choice_shape, justify=tk.LEFT, command=input_basic_graphic_bg).grid(row=2, column=4)
    tk.Radiobutton(windows, text='五角星', value=5, variable=choice_shape, justify=tk.LEFT, command=input_basic_graphic_bg).grid(row=2, column=5)
    tk.Radiobutton(windows, text='自导入', value=6, variable=choice_shape, justify=tk.LEFT, command=input_own_bg).grid(row=2, column=6)

    choice_color = tk.IntVar()
    choice_color.set(1)
    tk.Label(windows, text='图形颜色:').grid(row=3, column=0, padx=5)
    tk.Radiobutton(windows, text='RGB:', value=1, variable=choice_color, justify=tk.LEFT, width=5, command=input_rgb, state=tk.NORMAL).grid(row=3, column=1)

    r = tk.IntVar()
    combobox_r = Combobox(windows, textvariable=r, width=3)
    combobox_r['value'] = tuple(range(256))
    combobox_r.set(0)
    combobox_r.grid(row=3, column=2)

    g = tk.IntVar()
    combobox_g = Combobox(windows, textvariable=g, width=3)
    combobox_g['value'] = tuple(range(256))
    combobox_g.set(0)
    combobox_g.grid(row=3, column=3)

    b = tk.IntVar()
    combobox_b = Combobox(windows, textvariable=b, width=3)
    combobox_b['value'] = tuple(range(256))
    combobox_b.set(0)
    combobox_b.grid(row=3, column=4)

    tk.Radiobutton(windows, text='十六进制:#', value=2, variable=choice_color, justify=tk.LEFT, width=8, command=input_hex).grid(row=3, column=5)
    hex_color = tk.StringVar()
    entry3 = tk.Entry(windows, textvariable=hex_color, validate='key', validatecommand=(windows.register(check_hex), '%P'), width=7, state=tk.DISABLED)
    hex_color.set('000000')
    entry3.grid(row=3, column=6)

    button_draw = tk.Button(windows, text='绘制词云图', command=wordcloud, fg='red', width=9, height=2, state=tk.DISABLED)
    button_draw.bind('<Motion>', check)
    button_draw.grid(row=2, column=7, rowspan=2, columnspan=1, padx=2)

    windows.mainloop()

三、效果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

python通过tkinter制作词云图工具

四、源代码下载(含虚拟环境)

在这里插入图片描述
词云图工具下载链接:
https://url86.ctfile.com/f/32005086-932012628-2a8f6b?p=5422
访问密码:5422

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

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

相关文章

大乘数法 -Java

题目链接&#xff1a;https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&titl…

SAP 批量删除变式

使用事务码se38进入变式&#xff0c;通过搜索帮助选中一个变式&#xff0c;点击显示。 点击目录&#xff0c;会显示所有的变式名称。 会显示当前程序的所有变式&#xff0c;然后点击删除按钮&#xff0c;选择需要删除的变式。

CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构

编辑 | Happy 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw project, paper, code Token Mixer是ViT骨干非常重要的组成成分&#xff0c;它用于对不同空域位置信息进行自适应聚合&#xff0c;但常规的自注意力往往存在高计算复杂度与高延迟问题。…

FP130A 封装SOT23-5L 轨道电流测量IC

FP130A 封装SOT23-5L 轨道电流测量IC 一般说明 FP130A是一种宽共模范围高侧轨电流测量IC。它适用于电源系统&#xff0c;如电池充电器或开关电源的应用。它包括一个差分输入放大器和一个具有发射极输出的NPN晶体管。有三个外部电阻&#xff0c;轨道电流信号可以很容易地转换为I…

VR软件与管理后台的协议(微信扫码)

一、微信扫码登录 1、设计流程&#xff1a; ①、VR软件界面生成二维码&#xff0c;二维码中携带跳转小程序的链接及设备号、公司ID&#xff1b;用户通过扫码进入微信小程序点击界面一键启动&#xff0c;开始完善个人信息。 ②、用户点击一键启动&#xff0c;用户信息的授权状态…

入门人工智能 —— 学习 python 使用 IDE :vscode 完成编程 (2)

入门人工智能 —— 学习 python 使用 IDE &#xff1a;vscode 完成编程 &#xff08;2&#xff09; 安装和配置 VSCode创建和运行 Python 代码使用 VSCode 的调试功能 在上一篇文章中&#xff0c;介绍了如何入门人工智能编程&#xff0c;并开始了学习 Python 编程语言的基础知识…

润和软件HopeStage与上海瑞美云LIS系统管理软件完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与上海瑞美电脑科技有限公司&#xff08;以下简称“上海瑞美”&#xff09;瑞美云LIS系统管理软件完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统…

NFTScan NFT API 在 NFTFi 开发中的应用

NFTFi 是“NFT”和“Finance”的缩写&#xff0c;旨在“增加 NFT 流动性&#xff0c;提供现金流”&#xff0c;NFTFi 是为 NFT 提供金融实用性的去中心化协议和应用程序的新兴生态系统&#xff0c;及使用 NFT 作为基础层在其上建设经济基础设施。 在实践中&#xff0c;NFTFi 协…

yolov7中Concat之后加注意力模块(最复杂的情况)

1、common.py中找到Concat模块&#xff0c;复制一份 2、要传参进来&#xff0c;dim通道数 3、然后找yolo.py模块&#xff0c;添加 4、yaml里替换 5、和加的位置也有关系

20 Spring Boot整合Redis

一、Redis简介 简单来说 Redis 就是一个使用 C 语言开发的数据库&#xff0c;不过与传统数据库不同的是 Redis 的数据是存在内存中的 &#xff0c;也就是它是内存数据库&#xff0c;所以读写速度非常快&#xff0c;因此 Redis 被广泛应用于缓存方向。 另外&#xff0c;Redis 除…

c++ vs2019 cpp20 规范,set源码分析

&#xff08;1&#xff09;set模板和map模板都是继承于一个父类 所以没有再详细注释。维持红黑树主要的功能都在父类_Tree里了&#xff0c;比如节点的添加&#xff0c;删除&#xff0c;查找。父类红黑树的操作&#xff0c;并不依赖于特定的数据类型。做到了父类模板的通用性。…

Linux学习之MySQL连接查询

接上一篇 连接查询 连接查询也中多表查询&#xff0c;常用于查询来自于多张表的数据&#xff0c;通过不同的连接方式把多张表组成一张新的临时表&#xff0c;再对临时表做数据处理。 #表基础信息&#xff0c;内容可从上一篇博客中查看 mysql> desc departments; ---------…

第15章_锁: (表级锁、页级锁、行锁、悲观锁、乐观锁、全局锁、死锁)

3.2 从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁 为了提高数据库并发度&#xff0c;每次锁定的数据范围越小越好&#xff0c;理论上每次只锁定当前操作的数据的方案会得到最大的并发度&#xff0c;但管理锁是很耗资源&#xff08;涉及获取、检查、释放锁等动作)。因…

我总结的《149个Python面试题.pdf》,都是干货!

大家好&#xff0c;我是涛哥。 很多小伙伴找Python面试资料&#xff0c;所以为了方便大家&#xff0c;涛哥我整理了《149个Python面试干货》&#xff0c;方便大家进行学习&#xff0c;尤其是要面试学习的同学可以重点学起来。 第一个部分就是讲Python基础相关内容 第二个部分…

JAVA毕业设计097—基于Java+Springboot+Vue+uniapp的医院挂号小程序系统(源码+数据库)

基于JavaSpringbootVueuniapp的医院挂号小程序系统(源码数据库)097 一、系统介绍 本系统前后端分离(网页端和小程序端都有) 本系统分为管理员、医院、用户三种角色(角色菜单可自行分配) 用户功能&#xff1a; 注册、登录、医院搜索、最新资讯、医生搜索、挂号预约、挂号记…

由于找不到msvcp120.dll无法继续执行代码,重新安装相关软件

在我们的生活中&#xff0c;计算机已经成为不可或缺的工具&#xff0c;我们依赖它来进行工作、学习和娱乐。然而&#xff0c;当我们在使用计算机时&#xff0c;有时会遭遇一些令人烦恼的问题&#xff0c;例如“找不到 msvcp120.dll 无法继续执行代码”的错误提示。这究竟是什么…

TGA格式文件转材质

今天淘宝上买了一个美女的模型&#xff0c;是blender的源文件&#xff0c;上面说有fbx格式的。我用unity&#xff0c;所以觉得应该可以用。文件内容如下图&#xff1a; FBX文件夹打开后&#xff0c;内容如下图所示&#xff0c;当时就预感到可能没有色彩。 unity打开后果然发现只…

Go 报错 Package libzmq was not found in the pkg-config search path.

make编译程序时&#xff0c;报错提示如下: 因为 zmq.h 是包含在开发包 libczmq-dev 中的&#xff0c;libzmq.pc 也是在 dev 包安装时才被导入&#xff0c;故需安装如下两个包&#xff1a; sudo apt install libzmq5 libczmq-dev

9月7日上课内容 redis群集

redis高可用重点回顾 redis的两种持久化方式 rdb 优缺点 缺点 ① 数据完整性不如AOF ② RDB类似于快照&#xff08;完备&#xff09; ③ 在进行备份时会阻塞进程 优点 ① 持久化的速度比较快&#xff08;因为保存的是数据结果&#xff09;&#xff0c;在写入到*.rdb持久化文…

C++内存泄露

目录 1.什么是内存泄露 2.内存泄露的危害 3.如何解决内存泄露等相关的问题 1.什么是内存泄露 在C/C中 &#xff0c;我们申请了资源&#xff0c;因为一些原因忘记对申请的资源进行释放&#xff0c;或者因为异常安全等问题没有进行释放就会造成内存泄露的。 2.内存泄露的危害…