import matplotlib.backends.backend_tkagg as tkagg
#tk: tkinter ; agg: Anti-Grain Geometry 
#Anti-Grain: 消除顆粒狀紋理(鋸齒)
import matplotlib.pyplot as plt
#import tkinter as tk
from tkinter import Tk,Canvas,Label,Entry,Button
#Canvas: 畫布
def plot_graph(xmin, xmax, ymin, ymax, fontsize, canvas):
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    
    fig, ax = plt.subplots()
    ax.plot(x, y)
    ax.set_xlim(xmin, xmax)
    ax.set_ylim(ymin, ymax)
    ax.set_xlabel('X Label', fontsize=fontsize)
    ax.set_ylabel('Y Label', fontsize=fontsize)
    ax.tick_params(axis='both', labelsize=fontsize)
    tkagg.FigureCanvasTkAgg(fig, canvas).get_tk_widget().grid()
root = Tk()
root.title('Graph Settings')
# root.geometry("350x130") #350x130: 用試的
Label(root, text='X min:').grid(row=0, column=0)
xmin_entry = Entry(root)
xmin_entry.grid(row=0, column=1)
Label(root, text='X max:').grid(row=1, column=0)
xmax_entry = Entry(root)
xmax_entry.grid(row=1, column=1)
Label(root, text='Y min:').grid(row=2, column=0)
ymin_entry = Entry(root)
ymin_entry.grid(row=2, column=1)
Label(root, text='Y max:').grid(row=3, column=0)
ymax_entry = Entry(root)
ymax_entry.grid(row=3, column=1)
Label(root, text='Font size:').grid(row=4, column=0)
fontsize_entry = Entry(root)
fontsize_entry.grid(row=4, column=1)
canvas = Canvas(root)
canvas.grid(row=6, columnspan=2)
#顯示圖形的位置
submit_button = Button(root, text='Submit', command=lambda: plot_graph(
    float(xmin_entry.get()), 
    float(xmax_entry.get()), 
    float(ymin_entry.get()), 
    float(ymax_entry.get()), 
    int(fontsize_entry.get()),
    canvas))
submit_button.grid(row=5, column=1)
root.mainloop()    tkagg.FigureCanvasTkAgg(fig, canvas).get_tk_widget().grid() 
tkagg.FigureCanvasTkAgg  是 Matplotlib 的一个后端,它提供了在 tkinter 中嵌入 Matplotlib 图形的方法。在这个方法中,fig 是 Matplotlib 中的一个 Figure 对象,canvas 是一个 Tkinter 的画布对象。tkagg.FigureCanvasTkAgg(fig, canvas) 返回一个 FigureCanvasTkAgg 对象,它是 FigureCanvas 类的一个子类,提供了在 tkinter 窗口中展示 Matplotlib 图形的方法。get_tk_widget() 方法返回一个 tkinter 的窗口小部件对象,它可以在 tkinter 窗口中进行布局和显示。
在这个例子中,這行程式碼的作用是將 fig (Matplotlib 的 figure 物件) 畫在 tkinter 的視窗中。具體而言,這裡使用了 Matplotlib 的 FigureCanvasTkAgg 類別來建立一個 tkinter 的 widget,並將 fig 畫在這個 widget 上。然後,使用 grid() 方法將 widget 放置在視窗中。
簡單來說,這行程式碼的作用是將 Matplotlib 的圖形顯示在 tkinter 的視窗中。
    在 tk.Button 的 command 中使用 lambda (後面不加參數) 可以避免在按鈕創建時立即執行函式,而如果使用 lambda + 參數,則函式會在創建按鈕時就被執行,這是因為 lambda 會在創建時被求值,而不是在按下按鈕時才被調用。
如果你需要在按下按鈕時才執行該函式,就需要使用 command 的值為一個函式,這個函式會在按下按鈕時被調用。在這個函式中,可以使用 lambda 來傳遞一些參數給 plot_graph 函式,以便在按下按鈕時調用 plot_graph 並傳遞這些參數。
總結來說,使用 lambda 的目的是為了將函式作為一個值傳遞給 command,以便在按下按鈕時調用該函式。另外,使用 lambda 還可以傳遞一些參數給函式,這樣可以在調用函式時設置一些參數。
輸出結果:
Submit後:
推薦hahow線上學習python: https://igrape.net/30afN
讓Entry有預設值:
import matplotlib.backends.backend_tkagg as tkagg
import matplotlib.pyplot as plt
from tkinter import Tk, Canvas, Label, Entry, Button
import tkinter as tk
def plot_graph(xmin, xmax, ymin, ymax, fontsize, canvas):
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    
    fig, ax = plt.subplots()
    ax.plot(x, y)
    ax.set_xlim(xmin, xmax)
    ax.set_ylim(ymin, ymax)
    ax.set_xlabel('X Label', fontsize=fontsize)
    ax.set_ylabel('Y Label', fontsize=fontsize)
    ax.tick_params(axis='both', labelsize=fontsize)
    
    tkagg.FigureCanvasTkAgg(fig, canvas).get_tk_widget().grid()
root = Tk()
root.title('Graph Settings')
xmin_var = tk.StringVar(value='1')
Label(root, text='X min:').grid(row=0, column=0)
xmin_entry = Entry(root, textvariable=xmin_var)
#textvariable 參數的值必須是 StringVar 物件,而不是字串。
xmin_entry.grid(row=0, column=1)
xmax_var = tk.StringVar(value='5')
Label(root, text='X max:').grid(row=1, column=0)
xmax_entry = Entry(root, textvariable=xmax_var)
xmax_entry.grid(row=1, column=1)
ymin_var = tk.StringVar(value='0')
Label(root, text='Y min:').grid(row=2, column=0)
ymin_entry = Entry(root, textvariable=ymin_var)
ymin_entry.grid(row=2, column=1)
ymax_var = tk.StringVar(value='10')
Label(root, text='Y max:').grid(row=3, column=0)
ymax_entry = Entry(root, textvariable=ymax_var)
ymax_entry.grid(row=3, column=1)
fontsize_var = tk.StringVar(value='12')
Label(root, text='Font size:').grid(row=4, column=0)
fontsize_entry = Entry(root, textvariable=fontsize_var)
fontsize_entry.grid(row=4, column=1)
canvas = Canvas(root)
canvas.grid(row=6, columnspan=2)
submit_button = Button(root, text='Submit', command=lambda: plot_graph(
    float(xmin_entry.get()), 
    float(xmax_entry.get()), 
    float(ymin_entry.get()), 
    float(ymax_entry.get()), 
    int(fontsize_entry.get()),
    canvas))
submit_button.grid(row=5, column=1)
root.mainloop()
輸出結果(數字非自己的key的):
推薦hahow線上學習python: https://igrape.net/30afN
如果使用者沒有輸入數字,
xmin, xmax, ymin, ymax = None
(matplotlib自動設定):
import tkinter as tk
import matplotlib.pyplot as plt
import matplotlib.backends.backend_tkagg as tkagg
def plot_graph(xmin, xmax, ymin, ymax, fontsize, canvas):
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]
    fig, ax = plt.subplots()
    ax.plot(x, y)
    ax.set_xlabel('X Label', fontsize=fontsize)
    ax.set_ylabel('Y Label', fontsize=fontsize)
    ax.tick_params(axis='both', labelsize=fontsize)
    if xmin is not None and xmax is not None:
        ax.set_xlim(xmin, xmax)
    if ymin is not None and ymax is not None:
        ax.set_ylim(ymin, ymax)
    tkagg.FigureCanvasTkAgg(fig, canvas).get_tk_widget().grid()
def validate_entry(entry):
    try:
        float(entry.get())
        return True
    except ValueError:
        return False
def get_entry_value(entry):
    if validate_entry(entry):
        return float(entry.get())
    else:
        return None
root = tk.Tk()
root.title('Graph Settings')
tk.Label(root, text='X min:').grid(row=0, column=0)
xmin_entry = tk.Entry(root)
xmin_entry.grid(row=0, column=1)
tk.Label(root, text='X max:').grid(row=1, column=0)
xmax_entry = tk.Entry(root)
xmax_entry.grid(row=1, column=1)
tk.Label(root, text='Y min:').grid(row=2, column=0)
ymin_entry = tk.Entry(root)
ymin_entry.grid(row=2, column=1)
tk.Label(root, text='Y max:').grid(row=3, column=0)
ymax_entry = tk.Entry(root)
ymax_entry.grid(row=3, column=1)
tk.Label(root, text='Font size:').grid(row=4, column=0)
fontsize_entry = tk.Entry(root)
fontsize_entry.grid(row=4, column=1)
canvas = tk.Canvas(root)
canvas.grid(row=6, columnspan=2)
submit_button = tk.Button(root, text='Submit', command=lambda: plot_graph(
    get_entry_value(xmin_entry), 
    get_entry_value(xmax_entry), 
    get_entry_value(ymin_entry), 
    get_entry_value(ymax_entry), 
    int(fontsize_entry.get()),
    canvas))
submit_button.grid(row=5, column=1)
root.mainloop()
輸出結果:
類似以上,fonsize參數也做一樣的事
未輸入視為None (matplotlib預設):
輸出結果(故意都不輸入):
推薦hahow線上學習python: https://igrape.net/30afN
多一個選擇檔案(*.xlsx, *.csv)的Button,
檔案的第一欄當作X
其他欄當作Y作圖
輸出結果:
輸出結果2:
輸出結果3:
推薦hahow線上學習python: https://igrape.net/30afN