Stan rysowania
Narzędzie, kolor, grubość i punkt rozpoczęcia gestu — to parametry, a nie same figury.
Co program powinien zapamiętać między wydarzeniami
Trzy zmienne z Sekcji 18.3 (tekuschaya_figura,
tekuschij_cvet, tolschina) —
uczciwy prototyp, ale wraz z rozwojem aplikacji dodaje się punkt wyjścia gestu,
Ostatni punkt ołówka, id przybliżony wykres podglądu, oraz zmienne globalne pochodzą na
zbyt wielu, by pamiętać o ich więzi.
Nowość: Enum — wcześniej znany lista wariantów
Podczas gdy narzędzie jest przechowywane na sznurku, żadnych słowo wydaje się akceptowalne:
"pryamougolnik", "pryamougolnick",
"квадрат". Python nie ma nic przeciwko — nie wie, jakie masz opcje
Myślisz, że mają rację. Literówka pojawi się dużo później i w ogóle nie będzie obecna: znaczenie po prostu nie jest
będzie się pokrywać z dowolną gałęzią ifi klikanie myszką cicho się zatrzymuje
żeby coś narysować.
Ale narzędzie ma ograniczoną, wcześniej znaną liczbę opcji — ołówek, linia, prostokąt, elipsa, gumka. Dla takich przypadków w Python jest wyliczanie
(Enum z modułu enum): ty raz
zapisz wszystkie dopuszczalne wartości, a następnie używaj tylko ich.
from enum import Enum
class Tool(Enum):
PENCIL = "pencil"
LINE = "line"
RECTANGLE = "rectangle"
print(Tool.RECTANGLE) # Tool.RECTANGLE
print(Tool.RECTANGLE.value) # rectangle
print(Tool.RECTANGLE is Tool.PENCIL) # False
print(Tool.RECTANGL) #AttributeError – literówka jest widoczna NATYCHMIAST
Trzy rzeczy, o których warto pamiętać Enum:
Tool.RECTANGLEjest członek transferów, osobna wartość, nie łańcuch znaków. Łatwo jest ją przenosić i przechowywać;.valuewyciąga linię, którą do niej przypiąłeś — to Przyda się, gdy trzeba zapisać postać w JSON (sekcja 18.30);- terminy się porównoważają
is, nie==: wyraz enumeracyjny istnieje dokładnie w jednym przypadku, Zatemtool is Tool.ERASER— najdokładniejsza i najszybsza weryfikacja.
Główna różnica w stosunku do łańcucha: Tool.RECTANGL jest
AttributeError przy pierwszym wywołaniu, a
"pryamougolnick" — całkowicie „normalny” łańcuch znaków, o którym
Python milczy.
Zbieramy DrawingState
Teraz połączmy oba narzędzia: Enum dla narzędzia i
@dataclass (Rozdział 14.23) dla samego obiektu państwowego —
Usuwa to odręczne __init__ i od razu daje zrozumiałe
repr:
from dataclasses import dataclass
from enum import Enum
class Tool(Enum):
PENCIL = "pencil"
LINE = "line"
RECTANGLE = "rectangle"
OVAL = "oval"
ERASER = "eraser"
@dataclass
class DrawingState:
tool: Tool = Tool.PENCIL
color: str = "#111827"
width: int = 4
start_x: float | None = None
start_y: float | None = None
tekuschaya_figura = "pryamougolnik" działa, ale nie zauważy Python literówki w linii, dopóki kod nie zostanie wykonany i kształt nie zostanie cicho „nieznany” Tool.RECTANGLE jest takie samo pod względem znaczenia, ale literówka zostanie wykryta przez redaktora lub python -c "import module". Enum jest tu uzasadnione właśnie dlatego, że warianty instrumentu mają skończoną znaną liczbę. Jeśli istnieje tylko jeden wariant lub ich lista ciągle się zmienia, wystarczy regularna linia, a wyliczenie doda tylko ceremonię.
set_tool() zmienia się jednocześnie self.state.tool I relief potrzebny przycisk — ta sama kombinacja «model → odzwierciedlenie na ekranie», co i render() w rozdziale 17.