GUI 計算機
延續上一個 tkinter 專題,這次做一台計算機:一排數字和運算符號的按鈕,按了顯示在螢幕上,按「=」算出結果。這個專題會用到 tkinter 的格線排版,把按鈕排成整齊的一格一格。
把它存成 calculator.py 執行:
import tkinter as tk
def click(char): screen.insert(tk.END, char)
def clear(): screen.delete(0, tk.END)
def calculate(): try: result = eval(screen.get()) screen.delete(0, tk.END) screen.insert(tk.END, str(result)) except Exception: screen.delete(0, tk.END) screen.insert(tk.END, "錯誤")
window = tk.Tk()window.title("計算機")
screen = tk.Entry(window, width=20, font=("Arial", 18), justify="right")screen.grid(row=0, column=0, columnspan=4, padx=5, pady=5)
buttons = [ "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "*", "0", ".", "=", "/",]
row = 1col = 0for label in buttons: if label == "=": button = tk.Button(window, text=label, width=5, command=calculate) else: button = tk.Button(window, text=label, width=5, command=lambda c=label: click(c))
button.grid(row=row, column=col, padx=2, pady=2)
col = col + 1 if col > 3: col = 0 row = row + 1
clear_button = tk.Button(window, text="C", width=5, command=clear)clear_button.grid(row=row, column=0, padx=2, pady=2)
window.mainloop()- 格線排版
grid:這次用grid(row=, column=)而不是pack。它把視窗切成一格一格,你指定每個元件放在第幾列第幾欄,很適合排計算機這種格子狀的版面。columnspan=4讓螢幕橫跨四欄。 - 用迴圈生按鈕:十六個按鈕不必一個一個手寫。把符號放進串列,用
for一次做出來,再用row、col算出每個按鈕該放哪一格。 lambda c=label::這是把「按下這顆要送出的符號」記在按鈕上的寫法。lambda是一種簡短的函式;這裡的c=label是為了讓每顆按鈕記住自己當下的符號。eval():把螢幕上的算式字串(例如"3+4*2")直接當成 Python 運算式算出答案。它很方便,但也要小心。eval會執行字串裡的任何東西,只適合用在這種自己掌控輸入的小練習,不要拿去算來路不明的字串。try/except:萬一算式打錯(例如3++),eval會出錯,這裡用前面錯誤處理那章的做法接住它,在螢幕顯示「錯誤」而不是讓程式當掉。
自己動手改改看
Section titled “自己動手改改看”- 加一個「←」按鈕,刪掉最後一個字元(提示:先
screen.get()拿到現在的字串,去掉最後一個再重新填回去)。 - 幫不同類的按鈕上色,數字和運算符號用不同底色(提示:
tk.Button的bg參數)。