攝影或3C

Python: 如何用tkinter做出設定xmin, xmax, ymin, ymax, fontsize的GUI? 未輸入的話,視為None ( matplotlib 自動設定) ; import matplotlib.backends.backend_tkagg as tkagg ; from tkinter import Tk, Canvas, Label, Entry, Button ; 如何讓Entry中有預設值?

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.Buttoncommand 中使用 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

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡