Python+tkinter實(shí)現(xiàn)一個(gè)繪圖風(fēng)格控件
Python繪圖系統(tǒng):
從0開始的3D繪圖系統(tǒng)|一個(gè)3D坐標(biāo)系,多個(gè)函數(shù)
自定義控件:極坐標(biāo)繪圖|繪圖風(fēng)格
圖表類型和風(fēng)格:散點(diǎn)圖和條形圖|混合類型圖表|多子圖
繪圖風(fēng)格
以plot為例,下面列出常用參數(shù),其中枚舉類型表示有有限個(gè)可選擇的值,說明適用于Combobox控件。
參數(shù) | 類型 | 功能 |
---|---|---|
linestyle | 枚舉 | 線條類型 |
linewidth | 小數(shù) | 線條寬度 |
color | 字符串 | 顏色 |
marker | 枚舉 | 散點(diǎn)形狀 |
markersize | 小數(shù) | 指定點(diǎn)的大小。 |
markeredgecolor | 字符串 | 點(diǎn)的邊框色 |
label | 字符串 | 圖例標(biāo)簽 |
alpha | 小數(shù) | 透明度 |
zorder | 整數(shù) | 所在繪圖層 |
為了便于調(diào)用,可以將這些參數(shù)封裝為字典
def initConst(self): self.VAR_LABS = { "線型" : "linestyle", "線寬" : "linewidth", "線色" : "color", "點(diǎn)型" : "marker" , "點(diǎn)徑" : "markersize", "點(diǎn)色" : "markeredgecolor", "標(biāo)簽" : "label" , "透明度" : "alpha", "層號" : "zorder" } self.STR_KEYS = ["標(biāo)簽"] self.COM_KEYS = ["線型", "點(diǎn)型"] self.NUM_KEYS = ["線寬", "點(diǎn)徑", "透明度"] self.INT_KEYS = ["層號"] self.CLR_KEYS = ["線色", "點(diǎn)色"]
這樣一來,初始化StringVar就方便很多
def initVars(self): self.varDct = {key:tk.StringVar() for key in self.VAR_LABS}
但接下來才是重頭戲,UI繪制。
線型和點(diǎn)型
matplotlib中有四種線型,分別實(shí)現(xiàn)、虛線、點(diǎn)劃線和點(diǎn)線,分別記作’-‘, ‘–’, ‘-.’, ‘:’;點(diǎn)型相對較多,標(biāo)志有這些:’.‘, ‘,’, ‘1’, ‘2’, ‘3’, ‘4’, ‘+’, ‘x’, ‘|’, ‘_’, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ‘o’, ‘v’, ‘^’, ‘<’, ‘>’, ‘8’, ‘s’, ‘p’, ‘*’, ‘h’, ‘H’, ‘D’, ‘d’, ‘P’, ‘X’。
而點(diǎn)和線的設(shè)置均包含形狀、尺寸以及顏色,基于這種對偶關(guān)系,可以將這些參數(shù)設(shè)成下列形式
def initLineMarker(self): enumDct = { "點(diǎn)型" : ['.', ',', '1', '2', '3', '4', '+', 'x', '|', '_', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X'], "線型" : ['-', '--', '-.', ':'] } frm = self.newFrame() for i in range(2): key = self.COM_KEYS[i] ttk.Label(frm, text=key).grid(row=i, column=0, padx=2) tmp = ttk.Combobox(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i, column=1, padx=2, pady=2) tmp['value'] = enumDct[key] key = self.NUM_KEYS[i] ttk.Label(frm, text=key).grid(row=i, column=2, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i, column=3, padx=2, pady=2) key = self.CLR_KEYS[i] ttk.Label(frm, text=key).grid(row=i, column=4, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i, column=5, padx=2, pady=2)
其他參數(shù)
這樣一來就只剩下標(biāo)簽,層號和透明度這三個(gè)參數(shù)了,由于標(biāo)簽頗有標(biāo)題的意味,所以把這三個(gè)參數(shù)放在線型上面。
由于這些都是Entry和Label的組合,沒什么值得說的,反正最后也要附上源代碼,所以就從略了。
最后得到
源代碼
目前整個(gè)項(xiàng)目的代碼已經(jīng)400多行,如果全粘在下面可讀性比較差,故只把DrawStyle類的實(shí)現(xiàn)放在下面。完整代碼可參考前幾篇博客。
class DrawStyle(ttk.Frame): def __init__(self, master, varDct={}, ws=None, func=None, **options): super().__init__(master, **options) self.pack() self.initConst() self.initVars() self.initWidgets() def initConst(self): self.VAR_LABS = { "線型" : "linestyle", "線寬" : "linewidth", "線色" : "color", "點(diǎn)型" : "marker" , "點(diǎn)徑" : "markersize", "點(diǎn)色" : "markeredgecolor", "標(biāo)簽" : "label" , "透明度" : "alpha", "層號" : "zorder" } self.STR_KEYS = ["標(biāo)簽"] self.COM_KEYS = ["線型", "點(diǎn)型"] self.NUM_KEYS = ["線寬", "點(diǎn)徑", "透明度"] self.INT_KEYS = ["層號"] self.CLR_KEYS = ["線色", "點(diǎn)色"] def initVars(self): self.varDct = {key:tk.StringVar() for key in self.VAR_LABS} def newFrame(self): frm = ttk.Frame(self) frm.pack(side=tk.TOP, fill=tk.X) return frm def initWidgets(self): frm = self.newFrame() for i,key in enumerate(["標(biāo)簽", "層號", "透明度"]): tk.Label(frm, text=key).grid(row=0, column=i*2, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=0, column=i*2+1, padx=2, pady=2) self.initLineMarker(frm) def initLineMarker(self, frm): enumDct = { "點(diǎn)型" : ['.', ',', '1', '2', '3', '4', '+', 'x', '|', '_', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'o', 'v', '^', '<', '>', '8', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X'], "線型" : ['-', '--', '-.', ':'] } for i in range(2): key = self.COM_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=0, padx=2) tmp = ttk.Combobox(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=1, padx=2, pady=2) tmp['value'] = enumDct[key] key = self.NUM_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=2, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=3, padx=2, pady=2) key = self.CLR_KEYS[i] ttk.Label(frm, text=key).grid(row=i+1, column=4, padx=2) tmp = ttk.Entry(frm, width=10, textvariable=self.varDct[key]) tmp.grid(row=i+1, column=5, padx=2, pady=2) def getOneVar(self, key): v = self.varDct[key].get() if key in NUM_KEYS: return float(v) elif key in INT_KEYS: return int(v) else: return v def getVarDct(self): return {self.VAR_LABS[key] : self.varDct[key].get() for key in self.varDct}
以上就是Python+tkinter實(shí)現(xiàn)一個(gè)繪圖風(fēng)格控件的詳細(xì)內(nèi)容,更多關(guān)于Python tkinter的資料請關(guān)注腳本之家其它相關(guān)文章
相關(guān)文章
詳細(xì)解析Python中__init__()方法的高級應(yīng)用
這篇文章主要介紹了詳細(xì)解析Python中__init__()方法的高級應(yīng)用,包括在映射和elif序列等地方的更為復(fù)雜的用法,需要的朋友可以參考下2015-05-05使用Python開發(fā)windows GUI程序入門實(shí)例
這篇文章主要介紹了使用Python開發(fā)windows GUI程序入門實(shí)例,本文著重介紹開發(fā)環(huán)境必須的軟件,代碼實(shí)現(xiàn)相對簡單,需要的朋友可以參考下2014-10-10Python?3.11.0下載安裝并使用help查看模塊信息的方法
本文給大家介紹Python?3.11.0下載安裝并使用help查看模塊信息的相關(guān)知識,首先給大家講解了Python?3.11.0下載及安裝緊接著介紹了在命令行使用help查看模塊信息的方法,感興趣的朋友跟隨小編一起看看吧2022-11-112020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測可用
這篇文章主要介紹了2020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測可用,特此分享到腳本之家平臺(tái),需要的朋友可以參考下2020-03-03Python編寫的com組件發(fā)生R6034錯(cuò)誤的原因與解決辦法
pythoncom27.dll可能沒有包含manifest信息,或者沒有包含正確的manifest信息,或者系統(tǒng)中的c++ runtime library受到破壞都有可能造成這種現(xiàn)象2013-04-04python中關(guān)于eval函數(shù)的使用及說明
這篇文章主要介紹了python中關(guān)于eval函數(shù)的使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05ubuntu16.04升級Python3.5到Python3.7的方法步驟
這篇文章主要介紹了ubuntu16.04升級Python3.5到Python3.7的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python 在OpenCV里實(shí)現(xiàn)仿射變換—坐標(biāo)變換效果
這篇文章主要介紹了Python 在OpenCV里實(shí)現(xiàn)仿射變換—坐標(biāo)變換效果,本文通過一個(gè)例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08