基于Python編寫一個(gè)詞云制作程序
參數(shù)字典
自從做了熱榜的詞云之后,就越來(lái)越覺(jué)得詞云的表達(dá)力真的很強(qiáng),所以合計(jì)是不是可以為WordCloud做一個(gè)界面,來(lái)更加直觀地操作。
既然以WordCloud為核心,那么界面的組件自然要和WordCloud的參數(shù)意義綁定,每個(gè)參數(shù)在界面中都對(duì)應(yīng)一個(gè)提示組件,比如Lable,和一個(gè)輸入組件,比如Entry。此外,這些參數(shù)都是可設(shè)的,那么在對(duì)應(yīng)一個(gè)組件的同時(shí),也應(yīng)該對(duì)應(yīng)一個(gè)StringVar。
簡(jiǎn)單起見(jiàn),現(xiàn)在只挑選幾個(gè)必備的參數(shù),來(lái)演示這個(gè)邏輯的實(shí)現(xiàn)方法
參數(shù) | 說(shuō)明 | 適用組件 | 參數(shù) |
---|---|---|---|
width | 詞云寬度 | Spinbox | 100-2000, 10 |
height | 詞云高度 | Spinbox | 100-2000, 10 |
scale | 縮放 | Spinbox | 0.5-10, 0.1 |
輸入文本 | 路徑對(duì)話框 | ||
輸出詞云 | 路徑對(duì)話框 | ||
font_path | 字體文件路徑 | 路徑對(duì)話框 |
將這些參數(shù)封裝成一個(gè)字典,內(nèi)容如下
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是自定義的一個(gè)組件,主要包括一個(gè)按鈕和一個(gè)輸入框,點(diǎn)擊按鈕可以彈出文件對(duì)話框。
布局
有了這個(gè)字典,就可以據(jù)此來(lái)布局了
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] # 組件參數(shù) n = v["call"] # 調(diào)用名 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)
在布局過(guò)程中,對(duì)SpinBox類型的變量和DialogButton型的變量分別做了不同的處理,并且為它們分別設(shè)計(jì)了全局變量字典self.spins和self.paths,以便于調(diào)用。
布局結(jié)果如下
其中,genWordCloud用于詞云輸出,考慮到分詞的準(zhǔn)確性,這里仍然采用jieba進(jìn)行分詞,并為分詞專門設(shè)計(jì)一個(gè)函數(shù),其最終實(shí)現(xiàn)如下。
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] # 取出長(zhǎng)度大于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)
測(cè)試結(jié)果
最后,按照慣例,做一下測(cè)試
if __name__ == "__main__": root = tk.Tk() DrawWords(root).pack(side=tk.TOP, fill=tk.BOTH) root.mainloop()
效果如下
到此這篇關(guān)于基于Python編寫一個(gè)詞云制作程序的文章就介紹到這了,更多相關(guān)python詞云內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python的scipy實(shí)現(xiàn)插值的示例代碼
這篇文章主要介紹了python的scipy實(shí)現(xiàn)插值的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Android+OpenCv4實(shí)現(xiàn)邊緣檢測(cè)及輪廓繪制出圖像最大邊緣
最近工作需求,需要用opencv來(lái)先做一個(gè)demo,掃描照片進(jìn)行邊緣檢測(cè)和最大邊緣,就整理出來(lái)介紹一下,感興趣的小伙伴們可以參考一下2021-05-05Python和JS反爬之解決反爬參數(shù)?signKey
這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類,叫做字體反爬,核心的理論就是通過(guò)字體文件或者?CSS?偏移,接下來(lái)文章的詳細(xì)介紹,需要的小伙伴可以參考一下2022-05-05利用Python實(shí)現(xiàn)繪制論文中的曲線圖
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)繪制論文中需要的曲線圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子
這篇文章主要介紹了django-利用session機(jī)制實(shí)現(xiàn)唯一登錄的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03python3 圖片referer防盜鏈的實(shí)現(xiàn)方法
本篇文章主要介紹了python3 圖片referer防盜鏈的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03