基于Python編寫一個詞云制作程序
參數(shù)字典
自從做了熱榜的詞云之后,就越來越覺得詞云的表達(dá)力真的很強,所以合計是不是可以為WordCloud做一個界面,來更加直觀地操作。
既然以WordCloud為核心,那么界面的組件自然要和WordCloud的參數(shù)意義綁定,每個參數(shù)在界面中都對應(yīng)一個提示組件,比如Lable,和一個輸入組件,比如Entry。此外,這些參數(shù)都是可設(shè)的,那么在對應(yīng)一個組件的同時,也應(yīng)該對應(yīng)一個StringVar。
簡單起見,現(xiàn)在只挑選幾個必備的參數(shù),來演示這個邏輯的實現(xiàn)方法
| 參數(shù) | 說明 | 適用組件 | 參數(shù) |
|---|---|---|---|
| width | 詞云寬度 | Spinbox | 100-2000, 10 |
| height | 詞云高度 | Spinbox | 100-2000, 10 |
| scale | 縮放 | Spinbox | 0.5-10, 0.1 |
| 輸入文本 | 路徑對話框 | ||
| 輸出詞云 | 路徑對話框 | ||
| font_path | 字體文件路徑 | 路徑對話框 |
將這些參數(shù)封裝成一個字典,內(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是自定義的一個組件,主要包括一個按鈕和一個輸入框,點擊按鈕可以彈出文件對話框。
布局
有了這個字典,就可以據(jù)此來布局了
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)
在布局過程中,對SpinBox類型的變量和DialogButton型的變量分別做了不同的處理,并且為它們分別設(shè)計了全局變量字典self.spins和self.paths,以便于調(diào)用。
布局結(jié)果如下

其中,genWordCloud用于詞云輸出,考慮到分詞的準(zhǔn)確性,這里仍然采用jieba進(jìn)行分詞,并為分詞專門設(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] # 取出長度大于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)
測試結(jié)果
最后,按照慣例,做一下測試
if __name__ == "__main__":
root = tk.Tk()
DrawWords(root).pack(side=tk.TOP, fill=tk.BOTH)
root.mainloop()
效果如下

到此這篇關(guān)于基于Python編寫一個詞云制作程序的文章就介紹到這了,更多相關(guān)python詞云內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android+OpenCv4實現(xiàn)邊緣檢測及輪廓繪制出圖像最大邊緣
最近工作需求,需要用opencv來先做一個demo,掃描照片進(jìn)行邊緣檢測和最大邊緣,就整理出來介紹一下,感興趣的小伙伴們可以參考一下2021-05-05
Python和JS反爬之解決反爬參數(shù)?signKey
這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類,叫做字體反爬,核心的理論就是通過字體文件或者?CSS?偏移,接下來文章的詳細(xì)介紹,需要的小伙伴可以參考一下2022-05-05
django-利用session機制實現(xiàn)唯一登錄的例子
這篇文章主要介紹了django-利用session機制實現(xiàn)唯一登錄的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python3 圖片referer防盜鏈的實現(xiàn)方法
本篇文章主要介紹了python3 圖片referer防盜鏈的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

