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

python使用tkinter打造三維繪圖系統(tǒng)的示例代碼

 更新時間:2023年08月14日 09:54:20   作者:微小冷  
Python?的?tkinter?模塊是一個常用的?GUI(圖形用戶界面)工具包,它能夠讓你創(chuàng)建窗口應(yīng)用程序,你可以使用它來構(gòu)建用戶友好的界面,包括按鈕、標(biāo)簽、文本框、列表框等各種控件,本文講給大家介紹如何使用tkinter打造三維繪圖系統(tǒng),需要的朋友可以參考下

Python繪圖系統(tǒng)系列:python將matplotlib嵌入到tkinter中的步驟詳解_python_腳本之家 (jb51.net)

輸入數(shù)據(jù)

三維繪圖需要一個新的坐標(biāo)變量,設(shè)置為z,這個改改UI就可以辦到,并不困難。但是,此前用于設(shè)置x和y數(shù)據(jù)的函數(shù)實在是過于雷同,如果再寫一個設(shè)置z軸的,那么這個繪圖系統(tǒng)里就相當(dāng)于是有了3個一毛一樣的函數(shù),十分離譜,所以為了簡化代碼,可以將所有的數(shù)據(jù)輸入框設(shè)為一個字典,然后挨個生成xyz的輸入框,其中setFrmCtrl函數(shù)如下

def setFrmCtrl(self, frmCtrl):
    frm = ttk.Frame(frmCtrl, width=320)
    frm.pack(side=tk.TOP, fill=tk.X)
    self.setCtrlButtons(frm)
    self.entrys = {}
    for flag in 'xyz':
        frm = ttk.Frame(frmCtrl)
        frm.pack(side=tk.TOP, fill=tk.X)
        self.setFrmAxis(frm, flag)

setFrmAxis 則沒什么好說的,只是新增了一個參數(shù)而已。

def setFrmAxis(self, frm, flag):
    tk.Label(frm, text=flag).pack(side=tk.LEFT)
    self.entrys[flag] = tk.Entry(frm)
    self.entrys[flag].pack(side=tk.LEFT, fill=tk.X)    

加載數(shù)據(jù)

此前,分別用 self.xs self.ys 來表示x和y軸數(shù)據(jù),這又是一個雷同。為了簡化代碼,將變量也設(shè)做字典,在初始化的init函數(shù)中添加

self.data = {}

然后將加載數(shù)據(jù)的函數(shù)改寫為

def btnLoadData(self):
    name = askopenfilename()
    data = np.genfromtxt(name)
    for flag, i in enumerate()'xyz':
        if i >= data.shape[1]:
            return
        self.data[flag] = data[:,i]
        setEntry(self.entrys[flag], 'data')

然后新建一個用來讀取Entry的函數(shù),考慮到x和y都有可能用類似 1,1,5 的形式生成,所以先做一個檢測數(shù)組的全局函數(shù)

def detectArray(s):
    return s.rstrip('0123456789:, ')==''

然后是readEntrys函數(shù),考慮到在函數(shù)表達(dá)式中,用x和y指代self.data[‘x’]和selfdata[‘y’],所以需要新建局部變量x和y,以確保eval函數(shù)的正常使用。

def readEntrys(self):
    for flag in 'xyz':
        label = self.entrys[flag].get()
        if label != 'data':
            if detectArray(label):
                label = f"np.linspace({label})"
            self.data[flag] = eval(self.entrys[flag].get())
        if flag =='x' : x = self.data['x']
        elif flag =='y' : y = self.data['y']        
    if self.entrys['z'].get()=="":
        del self.data['z']

繪圖函數(shù)

最后,就是繪圖功能的實現(xiàn),由于有了readEntrys函數(shù),從而btnDrawImg函數(shù)變得更加專注,只需復(fù)制調(diào)用專門的繪圖函數(shù)就可以了。三維繪圖函數(shù)和二維繪圖函數(shù)其實沒什么區(qū)別,只要繪制的還是plot圖,區(qū)別只是多加了一個z軸坐標(biāo)而已。

def btnDrawImg(self):
    self.readEntrys()
    self.fig.clf()
    if 'z' in self.data: 
        self.drawPlot3D()
    else:
        self.drawPlot()
    self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)
    self.canvas.draw()

由于把用于設(shè)置邊框?qū)挾鹊膕ubplots_adjust以及canvas.draw放在了btnDrawImg這個函數(shù)中,所以drawPlot函數(shù)也需要做適當(dāng)?shù)木?。而drawPlot3D只是將projection設(shè)為‘3d’,同時添加一組z坐標(biāo)而已。

def drawPlot(self):
        ax = self.fig.add_subplot()
        ax.plot(self.data['x'], self.data['y'])
def drawPlot3D(self):
    ax = self.fig.add_subplot(projection='3d')
    ax.plot(self.data['x'], self.data['y'], self.data['z'])

至此,就可以看一下效果了

在這里插入圖片描述

源代碼

最后,附上源代碼

import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import askopenfilename
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure
import numpy as np
def setEntry(e, text):
    e.delete(0, "end")
    e.insert(0, text)
def detectArray(s):
    return s.rstrip('0123456789:, ')==''
class DarwSystem():
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("數(shù)據(jù)展示工具")
        self.data = {}
        frmCtrl = ttk.Frame(self.root,width=320)
        frmCtrl.pack(side=tk.RIGHT, fill=tk.Y)
        self.setFrmCtrl(frmCtrl)
        frmFig = ttk.Frame(self.root)
        frmFig.pack(side=tk.LEFT,fill=tk.BOTH,expand=tk.YES)
        self.setFrmFig(frmFig)
        self.root.mainloop()
    def setFrmCtrl(self, frmCtrl):
        frm = ttk.Frame(frmCtrl, width=320)
        frm.pack(side=tk.TOP, fill=tk.X)
        self.setCtrlButtons(frm)
        self.entrys = {}
        for flag in 'xyz':
            frm = ttk.Frame(frmCtrl)
            frm.pack(side=tk.TOP, fill=tk.X)
            self.setFrmAxis(frm, flag)
    def setFrmAxis(self, frm, flag):
        tk.Label(frm, text=flag).pack(side=tk.LEFT)
        self.entrys[flag] = tk.Entry(frm)
        self.entrys[flag].pack(side=tk.LEFT, fill=tk.X)    
    def setCtrlButtons(self, frm):
        ttk.Button(frm, text="繪圖",width=5,
            command=self.btnDrawImg).pack(side=tk.LEFT)
        ttk.Button(frm, text="加載",width=5,
            command=self.btnLoadData).pack(side=tk.LEFT)
    def btnLoadData(self):
        name = askopenfilename()
        data = np.genfromtxt(name)
        for i, flag in enumerate('xyz'):
            if i >= data.shape[1]:
                return
            self.data[flag] = data[:,i]
            setEntry(self.entrys[flag], 'data')
    def readEntrys(self):
        for flag in 'xyz':
            label = self.entrys[flag].get()
            if label=="":
                continue
            if label != 'data':
                if detectArray(label):
                    label = f"np.linspace({label})"
                self.data[flag] = eval(self.entrys[flag].get())
            if flag =='x' : x = self.data['x']
            elif flag =='y' : y = self.data['y']        
        if self.entrys['z'].get()=="":
            del self.data['z']
    def btnDrawImg(self):
        self.readEntrys()
        self.fig.clf()
        if 'z' in self.data:
            self.drawPlot3D()
        else:
            self.drawPlot()
        self.fig.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.08)
        self.canvas.draw()
    def drawPlot3D(self):
        ax = self.fig.add_subplot(projection='3d')
        ax.plot(self.data['x'], self.data['y'], self.data['z'])
    def drawPlot(self):
        ax = self.fig.add_subplot()
        ax.plot(self.data['x'], self.data['y'])
    def setFrmFig(self, frmFig):
        self.fig = Figure()
        self.canvas = FigureCanvasTkAgg(self.fig,frmFig)
        self.canvas.get_tk_widget().pack(
            side=tk.TOP,fill=tk.BOTH,expand=tk.YES)
        self.toolbar = NavigationToolbar2Tk(self.canvas,frmFig,
            pack_toolbar=False)
        self.toolbar.update()
        self.toolbar.pack(side=tk.RIGHT)
if __name__ == "__main__":
    test = DarwSystem()

以上就是python使用tkinter打造三維繪圖系統(tǒng)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于python tkinter三維繪圖系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入解析PYTHON?虛擬機令人拍案叫絕的字節(jié)碼設(shè)計

    深入解析PYTHON?虛擬機令人拍案叫絕的字節(jié)碼設(shè)計

    這篇文章主要為大家介紹了PYTHON虛擬機中令人拍案叫絕的字節(jié)碼設(shè)計深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 利用tkinter改變下拉列表(Combobox)的選項值

    利用tkinter改變下拉列表(Combobox)的選項值

    這篇文章主要介紹了利用tkinter改變下拉列表(Combobox)的選項值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解

    Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解

    今天小編就為大家分享一篇關(guān)于Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Django自定義模板過濾器和標(biāo)簽的實現(xiàn)方法

    Django自定義模板過濾器和標(biāo)簽的實現(xiàn)方法

    這篇文章主要介紹了Django自定義模板過濾器和標(biāo)簽的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • python中圖片轉(zhuǎn)換為pdf實現(xiàn)方法

    python中圖片轉(zhuǎn)換為pdf實現(xiàn)方法

    本文主要介紹了使用Python的Pillow分支和reportlab庫將圖片轉(zhuǎn)換為PDF文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • pygame實現(xiàn)俄羅斯方塊游戲(AI篇2)

    pygame實現(xiàn)俄羅斯方塊游戲(AI篇2)

    這篇文章主要為大家詳細(xì)介紹了pygame實現(xiàn)俄羅斯方塊游戲AI的第2篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python實現(xiàn)一個簡單的MySQL類

    Python實現(xiàn)一個簡單的MySQL類

    這篇文章主要介紹了Python實現(xiàn)一個簡單的MySQL類,可實現(xiàn)基本的初始化連接及查詢、刪除等功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • 詳解python播放音頻的三種方法

    詳解python播放音頻的三種方法

    這篇文章主要介紹了python播放音頻的三種方法,每種方法通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • 使用Nginx+uWsgi實現(xiàn)Python的Django框架站點動靜分離

    使用Nginx+uWsgi實現(xiàn)Python的Django框架站點動靜分離

    這篇文章主要介紹了使用Nginx+uWsgi實現(xiàn)Python的Django框架站點動靜分離的部署實例,即靜態(tài)由Nginx處理而Python頁面由Django自帶的HTTP服務(wù)器處理,需要的朋友可以參考下
    2016-03-03
  • 7個提高Python代碼運行效率的小技巧

    7個提高Python代碼運行效率的小技巧

    提高Python代碼的運行效率是每個Python開發(fā)者都關(guān)心的問題,本文有7個可以提高Python代碼運行效率的小貼士,希望對大家有一定的幫助
    2024-11-11

最新評論

汉中市| 永福县| 福贡县| 奇台县| 玉溪市| 罗定市| 合肥市| 兴业县| 华容县| 北川| 辽宁省| 乳山市| 武胜县| 绵阳市| 延津县| 英山县| 万荣县| 德令哈市| 晋城| 基隆市| 浙江省| 延寿县| 沙雅县| 拉萨市| 普陀区| 镇平县| 安化县| 达孜县| 固安县| 蒲江县| 镇平县| 拜城县| 宿迁市| 阿拉善右旗| 五河县| 长汀县| 阳春市| 莱芜市| 奉贤区| 玉环县| 安化县|