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è)可選擇的值,說(shuō)明適用于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", "層號(hào)" : "zorder"
}
self.STR_KEYS = ["標(biāo)簽"]
self.COM_KEYS = ["線型", "點(diǎn)型"]
self.NUM_KEYS = ["線寬", "點(diǎn)徑", "透明度"]
self.INT_KEYS = ["層號(hào)"]
self.CLR_KEYS = ["線色", "點(diǎn)色"]這樣一來(lái),初始化StringVar就方便很多
def initVars(self):
self.varDct = {key:tk.StringVar() for key in self.VAR_LABS}但接下來(lái)才是重頭戲,UI繪制。
線型和點(diǎn)型
matplotlib中有四種線型,分別實(shí)現(xiàn)、虛線、點(diǎn)劃線和點(diǎn)線,分別記作’-‘, ‘–’, ‘-.’, ‘:’;點(diǎn)型相對(duì)較多,標(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è)置均包含形狀、尺寸以及顏色,基于這種對(duì)偶關(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ù)
這樣一來(lái)就只剩下標(biāo)簽,層號(hào)和透明度這三個(gè)參數(shù)了,由于標(biāo)簽頗有標(biāo)題的意味,所以把這三個(gè)參數(shù)放在線型上面。
由于這些都是Entry和Label的組合,沒什么值得說(shuō)的,反正最后也要附上源代碼,所以就從略了。
最后得到

源代碼
目前整個(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", "層號(hào)" : "zorder"
}
self.STR_KEYS = ["標(biāo)簽"]
self.COM_KEYS = ["線型", "點(diǎn)型"]
self.NUM_KEYS = ["線寬", "點(diǎn)徑", "透明度"]
self.INT_KEYS = ["層號(hào)"]
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)簽", "層號(hà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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章
相關(guān)文章
FP-growth算法發(fā)現(xiàn)頻繁項(xiàng)集——構(gòu)建FP樹
常見的挖掘頻繁項(xiàng)集算法有兩類,一類是Apriori算法,另一類是FP-growth。Apriori通過(guò)不斷的構(gòu)造候選集、篩選候選集挖掘出頻繁項(xiàng)集,需要多次掃描原始數(shù)據(jù),當(dāng)原始數(shù)據(jù)較大時(shí),磁盤I/O次數(shù)太多,效率比較低下2021-06-06
解決Django 在ForeignKey中出現(xiàn) non-nullable field錯(cuò)誤的問題
今天小編就為大家分享一篇解決Django 在ForeignKey中出現(xiàn) non-nullable field錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
pytest內(nèi)置fixture使用臨時(shí)目錄流程詳解
fixture是在測(cè)試函數(shù)運(yùn)行前后,由pytest執(zhí)行的外殼函數(shù)。fixture中的代碼可以定制,滿足多變的測(cè)試需求,包括定義傳入測(cè)試中的數(shù)據(jù)集、配置測(cè)試前系統(tǒng)的初始狀態(tài)、為批量測(cè)試提供數(shù)據(jù)源等等。fixture是pytest的精髓所在2022-12-12
PyCharm 無(wú)法 import pandas 程序卡住的解決方式
這篇文章主要介紹了PyCharm 無(wú)法 import pandas 程序卡住的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼
這篇文章主要介紹了Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
使用setup.py安裝python包和卸載python包的方法
這篇文章主要介紹了使用setup.py安裝python包和卸載python包的方法,大家參考使用吧2013-11-11
Python中的分支與循環(huán)結(jié)構(gòu)解讀
這篇文章主要介紹了Python中的分支與循環(huán)結(jié)構(gòu)解讀,在Python編程中,分支(Branch)和循環(huán)(Loop)是掌握的關(guān)鍵要素之一,它們?cè)试S您根據(jù)條件執(zhí)行不同的代碼塊,以及重復(fù)執(zhí)行特定任務(wù),需要的朋友可以參考下2023-10-10

