Rozdział 16 · Tworzenie fajnych aplikacji z Tkinter
Mini Project: Konwerter temperatury
Prosta forma – ale z wzorową architekturą: czystą funkcją konwersji niezależną od interfejsu.
W praktyce forma „→ wejściowa sprawdzać → czystą funkcję → wyniku”
konverter_temperatur.py
def celsius_v_farengejty(celsius):
return celsius * 9 / 5 + 32
def farengejty_v_celsius(farengejty):
return (farengejty - 32) * 5 / 9
print(round(celsius_v_farengejty(100), 1)) # 212.0
print(round(celsius_v_farengejty(-40), 1)) # -40.0
print(round(celsius_v_farengejty(0), 1)) # 32.0
Temperatura nie musi być dodatnia
0°C, −5°C, −40°C to wszystkie temperatury całkowicie normalne. Przetwornik temperatury nie powinien być nadużywany
validate_positive_amount (Rozdział 16.23) odrzuciłby dane ujemne i zerowe jako "błąd". Potrzebne jest ogólne sprawdzenie "czy to liczba?" parse_number.konverter_gui.py
import tkinter as tk
from tkinter import ttk
def celsius_v_farengejty(celsius):
return celsius * 9 / 5 + 32
def parse_number(text):
text = text.strip()
if not text:
return False, None, „Pole nie może być puste"
try:
return True, float(text), ""
except ValueError:
return False, None, „Wprowadź numer”
root = tk.Tk()
celsius_var = tk.StringVar()
result_var = tk.StringVar()
def on_convert():
ok, value, message = parse_number(celsius_var.get())
if not ok:
result_var.set(message)
return
farengejty = celsius_v_farengejty(value)
result_var.set(f"{farengejty:.1f} °F")
ttk.Entry(root, textvariable=celsius_var).pack()
ttk.Button(root, text=„W Fahrenheita”, command=on_convert).pack()
ttk.Label(root, textvariable=result_var).pack()
parse_number już wiem
Funkcja
parse_number jest taki sam, jak ten, który napisaliśmy w sekcji 16.23. Po napisaniu i przetestowaniu funkcja parsowania liczb przydaje się w kilku projektach — tutaj bez dodatkowego wymogu „pozytywnego”★★ Zadanie samodzielne
Oba
Dodaj drugie pole oraz przycisk „W stopniach Celsjusza”
Praktyka: Przetwornik temperatury
Testowane bez tkinter – na czystych funkcjach konwersji, w tym wartości ujemnych