今天做一個桌面版單位換算器(長度、重量),純標準庫 Tkinter,零相依。介面簡單:選「類別 → 數值 → 從/到單位」,按下換算即可。
會做什麼
程式碼(存成 unit_converter_basic.py)
import tkinter as tk
from tkinter import ttk, messagebox
# ---- 資料定義 ----
CATEGORIES = ["長度", "重量"]
# 到基準單位的倍率:長度以 m、重量以 kg 為基準
LENGTH_TO_M = {
"mm": 1e-3, "cm": 1e-2, "m": 1.0, "km": 1e3,
"inch": 0.0254, "foot": 0.3048, "yard": 0.9144, "mile": 1609.344
}
MASS_TO_KG = {
"g": 1e-3, "kg": 1.0, "oz": 0.028349523125, "lb": 0.45359237, "ton": 1000.0 # metric tonne
}
UNITS_BY_CAT = {
"長度": list(LENGTH_TO_M.keys()),
"重量": list(MASS_TO_KG.keys()),
}
# ---- 轉換實作 ----
def convert_length(val, from_u, to_u):
base_m = val * LENGTH_TO_M[from_u]
return base_m / LENGTH_TO_M[to_u]
def convert_mass(val, from_u, to_u):
base_kg = val * MASS_TO_KG[from_u]
return base_kg / MASS_TO_KG[to_u]
def do_convert(_=None):
cat = cat_var.get()
try:
val = float(val_var.get())
except ValueError:
messagebox.showerror("輸入錯誤", "請輸入數字"); return
frm, to = from_var.get(), to_var.get()
try:
if cat == "長度": ans = convert_length(val, frm, to)
else: ans = convert_mass(val, frm, to)
except Exception as e:
messagebox.showerror("轉換錯誤", str(e)); return
result_var.set(f"{ans:.6g} {to}")
def swap_units():
a, b = from_var.get(), to_var.get()
from_var.set(b); to_var.set(a)
do_convert()
def on_category_change(_=None):
cat = cat_var.get()
units = UNITS_BY_CAT[cat]
from_var.set(units[0])
to_var.set(units[1] if len(units) > 1 else units[0])
from_box["values"] = units; to_box["values"] = units
result_var.set("")
# ---- 介面 ----
root = tk.Tk()
root.title("單位換算器 - 基礎版")
main = ttk.Frame(root, padding=16); main.grid()
root.columnconfigure(0, weight=1)
# 類別
ttk.Label(main, text="類別").grid(row=0, column=0, sticky="e", pady=4)
cat_var = tk.StringVar(value=CATEGORIES[0])
cat_box = ttk.Combobox(main, textvariable=cat_var, values=CATEGORIES, state="readonly", width=8)
cat_box.grid(row=0, column=1, sticky="w", pady=4)
cat_box.bind("<<ComboboxSelected>>", on_category_change)
# 數值
ttk.Label(main, text="數值").grid(row=1, column=0, sticky="e", pady=4)
val_var = tk.StringVar(value="1")
ttk.Entry(main, textvariable=val_var, width=14, justify="center").grid(row=1, column=1, sticky="w", pady=4)
# 單位
ttk.Label(main, text="從").grid(row=2, column=0, sticky="e", pady=4)
from_var = tk.StringVar(); from_box = ttk.Combobox(main, textvariable=from_var, state="readonly", width=8)
from_box.grid(row=2, column=1, sticky="w", pady=4)
ttk.Label(main, text="到").grid(row=3, column=0, sticky="e", pady=4)
to_var = tk.StringVar(); to_box = ttk.Combobox(main, textvariable=to_var, state="readonly", width=8)
to_box.grid(row=3, column=1, sticky="w", pady=4)
# 按鈕
btns = ttk.Frame(main); btns.grid(row=4, column=0, columnspan=2, pady=8)
ttk.Button(btns, text="換算 (Enter)", command=do_convert).grid(row=0, column=0, padx=4)
ttk.Button(btns, text="交換單位", command=swap_units).grid(row=0, column=1, padx=4)
# 結果
result_var = tk.StringVar(value="")
ttk.Label(main, text="結果").grid(row=5, column=0, sticky="e", pady=6)
ttk.Label(main, textvariable=result_var, font=("Segoe UI", 12)).grid(row=5, column=1, sticky="w", pady=6)
# 初始
on_category_change()
root.bind("<Return>", do_convert)
root.mainloop()
使用
python unit_converter_basic.py
實作:
小結 & 作業
用「基準單位」統一轉換流程,可擴充更多單位。