跳到內容

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 = 1
col = 0
for 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 一次做出來,再用 rowcol 算出每個按鈕該放哪一格。
  • lambda c=label::這是把「按下這顆要送出的符號」記在按鈕上的寫法。lambda 是一種簡短的函式;這裡的 c=label 是為了讓每顆按鈕記住自己當下的符號。
  • eval():把螢幕上的算式字串(例如 "3+4*2")直接當成 Python 運算式算出答案。它很方便,但也要小心。eval 會執行字串裡的任何東西,只適合用在這種自己掌控輸入的小練習,不要拿去算來路不明的字串。
  • try / except:萬一算式打錯(例如 3++),eval 會出錯,這裡用前面錯誤處理那章的做法接住它,在螢幕顯示「錯誤」而不是讓程式當掉。
  • 加一個「←」按鈕,刪掉最後一個字元(提示:先 screen.get() 拿到現在的字串,去掉最後一個再重新填回去)。
  • 幫不同類的按鈕上色,數字和運算符號用不同底色(提示:tk.Buttonbg 參數)。