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