使用python的Tkinter庫創建GUI


GUI:Graphical User Interface 圖形用戶界面

實現代碼:

from numpy import *
from tkinter import *
import regressionTrees
import matplotlib

matplotlib.use("TkAgg")  # 設定后端為TkAgg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

def reDraw(tolS, tolN):
    reDraw.f.clf()  # 清空之前的圖像
    reDraw.a = reDraw.f.add_subplot(111)  # 重新添加子圖
    if chkBtnVar.get():  # 檢查復選框是否選中,確定是模型樹還是回歸樹
        if tolN < 2:
            tolN = 2
        myTree = regressionTrees.createTree(reDraw.rawDat, regressionTrees.modelLeaf, regressionTrees.modelErr, (tolS, tolN))
        yHat = regressionTrees.createForeCast(myTree, reDraw.testDat, regressionTrees.modelTreeEval)
    else:   #回歸樹
        myTree = regressionTrees.createTree(reDraw.rawDat, ops=(tolS, tolN))
        yHat = regressionTrees.createForeCast(myTree, reDraw.testDat)
    reDraw.a.scatter(array(reDraw.rawDat[:, 0]),array(reDraw.rawDat[:, 1]), s=5)  # 畫真實值的散點圖
    reDraw.a.plot(reDraw.testDat, yHat, linewidth=2.0)  # 畫預測值的直線圖
    reDraw.canvas.draw()

def getInputs():  # 獲取用戶輸入的值,tolN期望得到整數值,tolS期望得到浮點數,
    try:
        tolN = int(tolNentry.get())  # 在Entry部件調用get方法,
    except:
        tolN = 10
        print("輸入int型數值作為tolN")
        tolNentry.delete(0, END)
        tolNentry.insert(0, "10")
    try:
        tolS = float(tolSentry.get())
    except:
        tolS = 1.0
        print("輸入浮點型數值作為tolS")
        tolSentry.delete(0, END)
        tolSentry.insert(0, "1.0")
    return tolN, tolS

def drawNewTree():  # 有人點擊ReDraw按鈕時就會調用該函數
    tolN, tolS = getInputs()  # 得到輸入框的值
    reDraw(tolS, tolN)

root = Tk()
# Label(root, text="繪制占位符").grid(row=0, columnspan=3)  # 設置文本,第0行,距0的行值為3,
reDraw.f = Figure(figsize=(5,4),dpi=100)
reDraw.canvas = FigureCanvasTkAgg(reDraw.f, master=root)
reDraw.canvas.draw()
reDraw.canvas.get_tk_widget().grid(row=0, columnspan=3)

Label(root, text="tolN").grid(row=1, column=0)
tolNentry = Entry(root)  # Entry為允許單行文本輸入的文本框,設置文本框,再定位置第1行第1列,再插入數值
tolNentry.grid(row=1, column=1)
tolNentry.insert(0, "10")

Label(root, text="tolS").grid(row=2, column=0)
tolSentry = Entry(root)
tolSentry.grid(row=2, column=1)
tolSentry.insert(0, "1.0")

Button(root, text="重畫", command=drawNewTree).grid(row=1, column=2, rowspan=3)  # Botton按鈕,設置第1行第2列,列值為3
chkBtnVar = IntVar()  # IntVar為按鈕整數值小部件
chkBtn = Checkbutton(root, text="模型樹", variable=chkBtnVar)
chkBtn.grid(row=3, column=0, columnspan=2)

reDraw.rawDat = mat(regressionTrees.loadDataSet("sine.txt"))
reDraw.testDat = arange(min(reDraw.rawDat[:, 0]), max(reDraw.rawDat[:, 0]), 0.01)
reDraw(1.0, 10)
root.mainloop()

 書上源代碼有以下錯誤:

AttributeError: 'FigureCanvasTkAgg' object has no attribute 'show'

解決方法:

將show()改為draw()即可。

ValueError: Masked arrays must be 1-D

解決方法:將矩陣改成數組。

將:

reDraw.a.scatter(reDraw.rawDat[:, 0],reDraw.rawDat[:, 1], s=5)

 改為:

reDraw.a.scatter(array(reDraw.rawDat[:, 0]),array(reDraw.rawDat[:, 1]), s=5)

 運行結果為:

勾選“模型樹”,重畫圖形:

改變tolN和tolS的值,可以得到不同的回歸樹和模型樹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM