iT邦幫忙

0

[Day24]單位換算器 GUI(Tkinter)

  • 分享至 

  • xImage
  •  

今天做一個桌面版單位換算器(長度、重量),純標準庫 Tkinter,零相依。介面簡單:選「類別 → 數值 → 從/到單位」,按下換算即可。

會做什麼

  • 兩大類:長度、重量
  • 單位
    • 長度:mm、cm、m、km、inch、foot、yard、mile
    • 重量:g、kg、oz、lb、ton(公噸)
  • 功能:換算、交換單位(From/To 互換)、Enter 快速換算
  • 輸入檢查:非數字會提示
    設計重點:先把「來源值」換成基準單位(長度→m、重量→kg),再換到目標單位,避免到處寫 if/else。

程式碼(存成 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

實作:
https://ithelp.ithome.com.tw/upload/images/20251008/20169368PGIB5shf6c.png
小結 & 作業
用「基準單位」統一轉換流程,可擴充更多單位。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言