python_GUI

텍스트워드클라우드

python_DV 2023. 1. 29. 18:04
728x90

from datetime import datetime
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import re
import konlpy
import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from PIL import ImageTk, Image
from io import BytesIO
import numpy as np


def choose():
    file_name1 = filedialog.askopenfilename(initialdir='path', title='select file', 
    filetypes=(('Txt Files', '*.txt'),('all files', '*.*')))
    global files_im
    files_im=file_name1
    if files_im == '':
                messagebox.showwarning("경고", "파일을 추가 하세요")
    input_entry.delete(0.0, END)
    input_entry.insert(INSERT,files_im)
    

def show_st():
    scr = open(files_im,encoding='utf-8').read()
    scr = re.sub('[^가-힣]',' ',scr)
    hannanum = konlpy.tag.Hannanum()
    nouns=hannanum.nouns(scr)
    df_word=pd.DataFrame({'word':nouns})
    df_word['count']=df_word['word'].str.len()
    df_word=df_word.query('count>=2')
    df_word.sort_values('count')
    df_word=df_word.groupby('word', as_index=False) \
                    .agg(n=('word','count')) \
                    .sort_values('n', ascending=False)

    dic_word=df_word.set_index('word').to_dict()['n']

    radSel=radVar.get()
    if radSel==1:
        font='NanumGothicLight.ttf'
    elif radSel==2:
        font='KOTRA_BOLD.ttf'

    radSel2=radVar3.get()

    if radSel2 ==0 :

        radSel1=radVar1.get()
        if radSel1==1:
            wc=WordCloud(random_state=1234,
                        font_path=font,
                        width=600,
                        height=400,
                        background_color='white')
        elif radSel1==2:
            wc=WordCloud(random_state=1234,
                            font_path=font,
                            width=600,
                            height=400,
                            background_color='white',
                            colormap='inferno')
        
    else:
        
        if radSel2==1:
            files_im1='구름.PNG'
        elif radSel2==2:
            files_im1='하트.PNG'
        elif radSel2==3:
            files_im1='별.PNG'
        elif radSel2==4:
            files_im1='고래.PNG'
        elif radSel2==5:
            files_im1='나무.PNG'

        icon=Image.open(files_im1)
        img_1=Image.new('RGB', icon.size, (255,255,255))
        img_1.paste(icon,icon)
        img_1=np.array(img_1)

        
        radSel1=radVar1.get()
        if radSel1==1:
            wc=WordCloud(random_state=1234,
                        font_path=font,
                        width=600,
                        height=400,
                        background_color='white',
                        mask=img_1)
        elif radSel1==2:
            wc=WordCloud(random_state=1234,
                            font_path=font,
                            width=600,
                            height=400,
                            background_color='white',
                            mask=img_1,
                            colormap='inferno')


    img_wordcloud=wc.generate_from_frequencies(dic_word)
    
    plt.rcParams.update({'font.family':'Malgun Gothic',
                    'figure.dpi':'100',
                    'figure.figsize' : [6,4]})
    plt.Figure(figsize=(6,4))
    plt.axis('off')
    plt.imshow(img_wordcloud)


    img_data = BytesIO()
    plt.savefig(img_data)

    load = Image.open(img_data)
    render = ImageTk.PhotoImage(load)
    canv.create_image(1, 1, anchor=NW, image=render)
    

def show_st1():
    scr=input_entry2.get()
    scr = re.sub('[^가-힣]',' ',scr)
    hannanum = konlpy.tag.Hannanum()
    nouns=hannanum.nouns(scr)
    df_word=pd.DataFrame({'word':nouns})
    df_word['count']=df_word['word'].str.len()
    df_word=df_word.query('count>=2')
    df_word.sort_values('count')
    df_word=df_word.groupby('word', as_index=False) \
                    .agg(n=('word','count')) \
                    .sort_values('n', ascending=False)

    dic_word=df_word.set_index('word').to_dict()['n']

    radSel=radVar.get()
    if radSel==1:
        font='NanumGothicLight.ttf'
    elif radSel==2:
        font='KOTRA_BOLD.ttf'

    radSel2=radVar3.get()

    if radSel2 ==0 :

        radSel1=radVar1.get()
        if radSel1==1:
            wc=WordCloud(random_state=1234,
                        font_path=font,
                        width=600,
                        height=400,
                        background_color='white')
        elif radSel1==2:
            wc=WordCloud(random_state=1234,
                            font_path=font,
                            width=600,
                            height=400,
                            background_color='white',
                            colormap='inferno')
        
    else:
        radSel2=radVar3.get()

        if radSel2==1:
            files_im1='구름.PNG'
        elif radSel2==2:
            files_im1='하트.PNG'
        elif radSel2==3:
            files_im1='별.PNG'
        elif radSel2==4:
            files_im1='고래.PNG'
        elif radSel2==5:
            files_im1='나무.PNG'

        icon=Image.open(files_im1)
        global img_1
        img_1=Image.new('RGB', icon.size, (255,255,255))
        img_1.paste(icon,icon)
        img_1=np.array(img_1)


        radSel1=radVar1.get()
        if radSel1==1:
            wc=WordCloud(random_state=1234,
                        font_path=font,
                        width=600,
                        height=400,
                        background_color='white',
                        mask=img_1)
        elif radSel1==2:
            wc=WordCloud(random_state=1234,
                            font_path=font,
                            width=600,
                            height=400,
                            background_color='white',
                            mask=img_1,
                            colormap='inferno')


    img_wordcloud=wc.generate_from_frequencies(dic_word)
    
    plt.rcParams.update({'font.family':'Malgun Gothic',
                    'figure.dpi':'100',
                    'figure.figsize' : [6,4]})
    plt.Figure(figsize=(6,4))
    plt.axis('off')
    plt.imshow(img_wordcloud)


    img_data = BytesIO()
    plt.savefig(img_data)

    load = Image.open(img_data)
    render = ImageTk.PhotoImage(load)
    canv.create_image(1, 1, anchor=NW, image=render)


def imsave():
    try:
        new_filesname=files_im[:-4]+'.jpg'
        
    except:
        date_t=datetime.now()
        date_t1=str(date_t).replace(':','-')
        date_t2=date_t1.replace(' ','')
        new_filesname=str(date_t2)+'.jpg'

    plt.savefig(new_filesname)
    messagebox.showinfo("변경완료", "확인해 보세요")   


def show_save():
    plt.show()


def select_cancle():
    radVar3.set(0)

win = Tk()
text= Text(win,wrap=WORD)
win.geometry("640x660+800+0") #340x250+3480+30
win.title('cloud_words')

ch_csvtoxl=LabelFrame(win, text='word_file_select')
ch_csvtoxl.grid(column=0, row=0, padx=8, pady=5)

chlb=Label(ch_csvtoxl, text="파일선택:",width=8).grid(column=0, row=0,sticky='W')
input_entry= Text(ch_csvtoxl, height=2, width=30, wrap=WORD)
input_entry.grid(column=1,columnspan=2, row=0,sticky='W')

lbID4=Label(ch_csvtoxl, text="",width=1).grid(column=3, row=0,sticky='W')
b1 = Button(ch_csvtoxl,text="검색",width=13, command=choose).grid(column=1, row=1,sticky='W')
b2 = Button(ch_csvtoxl,text="변환",width=13, command=show_st).grid(column=2, row=1,sticky='W')


ch1_csvtoxl=LabelFrame(win, text='style_select')
ch1_csvtoxl.grid(column=1, row=0, rowspan=2, padx=8, pady=5)

radVar3=IntVar()
repeat2_style=LabelFrame(ch1_csvtoxl, text='mask_style')
repeat2_style.grid(column=0, columnspan=2,row=0 ,padx=8, pady=5)
restyle5=Radiobutton(repeat2_style, text="구름", variable=radVar3, value=1).grid(column=0, row=0,sticky='W')
restyle6=Radiobutton(repeat2_style, text="하트", variable=radVar3, value=2).grid(column=1, row=0,sticky='W')
restyle7=Radiobutton(repeat2_style, text="별", variable=radVar3, value=3).grid(column=2, row=0,sticky='W')
restyle8=Radiobutton(repeat2_style, text="고래", variable=radVar3, value=4).grid(column=3, row=0,sticky='W')
restyle9=Radiobutton(repeat2_style, text="나무", variable=radVar3, value=5).grid(column=4, row=0,sticky='W')
b8 = Button(repeat2_style,text="삭제",height=1, width=3, command=select_cancle).grid(column=5, row=0)


radVar=IntVar()
repeat_style=LabelFrame(ch1_csvtoxl, text='text_style')
repeat_style.grid(column=0, row=1, padx=8, pady=5)
restyle1=Radiobutton(repeat_style, text="thin", variable=radVar, value=1).grid(column=0, row=0,sticky='W')
restyle2=Radiobutton(repeat_style, text="bold", variable=radVar, value=2).grid(column=1, row=0,sticky='W')
radVar.set(1)

radVar1=IntVar()
repeat_style1=LabelFrame(ch1_csvtoxl, text='color_style')
repeat_style1.grid(column=1, row=1, padx=8, pady=5)
restyle3=Radiobutton(repeat_style1, text="basic", variable=radVar1, value=1).grid(column=0, row=0,sticky='W')
restyle4=Radiobutton(repeat_style1, text="inferno", variable=radVar1, value=2).grid(column=1, row=0,sticky='W')
radVar1.set(1)

ch2_csvtoxl=LabelFrame(win, text='word_insert')
ch2_csvtoxl.grid(column=0, row=1, rowspan=2, padx=8, pady=5)

chlb=Label(ch2_csvtoxl, text="text:",width=8).grid(column=0, row=0,sticky='W')
input_entry2=Entry(ch2_csvtoxl, width=30)
input_entry2.grid(column=1, columnspan=2, row=0,sticky='W',ipady=15)

lbID4=Label(ch2_csvtoxl, text="",width=1).grid(column=3, row=0,sticky='W')
b5 = Button(ch2_csvtoxl,text="변환",width=29, command=show_st1).grid(column=1,columnspan=2, row=1,sticky='W')

ch3_csvtoxl=LabelFrame(win, text='save')
ch3_csvtoxl.grid(column=1, row=2, padx=8, pady=5)
b6 = Button(ch3_csvtoxl,text="저장_image_show",height=1, width=20, command=imsave).grid(column=0, row=0)
b7 = Button(ch3_csvtoxl,text="저장_other_save",height=1, width=20, command=show_save).grid(column=1, row=0)


can_vas=LabelFrame(win, text='image_show')
can_vas.grid(column=0,columnspan=3, row=3, padx=8, pady=5)

canv = Canvas(can_vas, width=600, height=400, bg='white')
canv.pack(fill=BOTH,expand=YES)

win.mainloop()
728x90
반응형