最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+tkinter實(shí)現(xiàn)一個(gè)繪圖風(fēng)格控件

 更新時(shí)間:2023年09月06日 10:44:55   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了Python如何利用tkinter實(shí)現(xiàn)一個(gè)簡單的繪圖風(fēng)格控件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下

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', '^', '&lt;', '&gt;', '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', '^', '&lt;', '&gt;', '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)文章

  • FP-growth算法發(fā)現(xiàn)頻繁項(xiàng)集——構(gòu)建FP樹

    FP-growth算法發(fā)現(xiàn)頻繁項(xiàng)集——構(gòu)建FP樹

    常見的挖掘頻繁項(xiàng)集算法有兩類,一類是Apriori算法,另一類是FP-growth。Apriori通過不斷的構(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ò)誤的問題

    今天小編就為大家分享一篇解決Django 在ForeignKey中出現(xiàn) non-nullable field錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python中加背景音樂如何操作

    python中加背景音樂如何操作

    在本篇文章里小編給大家整理了關(guān)于在python中加背景音樂的方法,需要的朋友們可以參考下。
    2020-07-07
  • pytest內(nèi)置fixture使用臨時(shí)目錄流程詳解

    pytest內(nèi)置fixture使用臨時(shí)目錄流程詳解

    fixture是在測試函數(shù)運(yùn)行前后,由pytest執(zhí)行的外殼函數(shù)。fixture中的代碼可以定制,滿足多變的測試需求,包括定義傳入測試中的數(shù)據(jù)集、配置測試前系統(tǒng)的初始狀態(tài)、為批量測試提供數(shù)據(jù)源等等。fixture是pytest的精髓所在
    2022-12-12
  • 如何查看Python安裝了哪些包

    如何查看Python安裝了哪些包

    這篇文章主要給大家介紹了關(guān)于如何查看Python安裝了哪些包的相關(guān)資料, Conda是另一種廣泛使用的Python包管理工具,它用于安裝、管理和升級軟件包和其依賴項(xiàng),需要的朋友可以參考下
    2023-07-07
  • PyCharm 無法 import pandas 程序卡住的解決方式

    PyCharm 無法 import pandas 程序卡住的解決方式

    這篇文章主要介紹了PyCharm 無法 import pandas 程序卡住的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python操作 hbase 數(shù)據(jù)的方法

    python操作 hbase 數(shù)據(jù)的方法

    下面小編就為大家?guī)硪黄猵ython操作 hbase 數(shù)據(jù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • Python操作Redis之設(shè)置key的過期時(shí)間實(shí)例代碼

    Python操作Redis之設(shè)置key的過期時(shí)間實(shí)例代碼

    這篇文章主要介紹了Python操作Redis之設(shè)置key的過期時(shí)間實(shí)例代碼,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 使用setup.py安裝python包和卸載python包的方法

    使用setup.py安裝python包和卸載python包的方法

    這篇文章主要介紹了使用setup.py安裝python包和卸載python包的方法,大家參考使用吧
    2013-11-11
  • Python中的分支與循環(huán)結(jié)構(gòu)解讀

    Python中的分支與循環(huán)結(jié)構(gòu)解讀

    這篇文章主要介紹了Python中的分支與循環(huán)結(jié)構(gòu)解讀,在Python編程中,分支(Branch)和循環(huán)(Loop)是掌握的關(guān)鍵要素之一,它們允許您根據(jù)條件執(zhí)行不同的代碼塊,以及重復(fù)執(zhí)行特定任務(wù),需要的朋友可以參考下
    2023-10-10

最新評論

灌南县| 金昌市| 绵阳市| 柳江县| 延寿县| 湟源县| 东乌珠穆沁旗| 海丰县| 通化市| 乐至县| 门头沟区| 安龙县| 金平| 自贡市| 离岛区| 四平市| 肥西县| 凤山市| 阿克陶县| 扎鲁特旗| 襄城县| 固原市| 衡水市| 东乡| 景洪市| 东阿县| 旌德县| 买车| 绥阳县| 英山县| 崇信县| 扬中市| 泰州市| 卫辉市| 甘南县| 丰镇市| 鄂托克旗| 罗山县| 永州市| 苏尼特左旗| 茂名市|