Rozdział 18 · Projekt: Aplikacja do rysowania

Skończyłem rysować! Pierwszy kompletny program

Ostatnie szlify pierwszego prototypu — czyszczenie płótna i swobodne rysowanie — i działający program w całości.

Skończyłem rysować!

Pozostaje dodać przycisk czyszczenia płótna oraz tryb „wolnego rysowania”

ochistka_i_svobodno.py
def ochistit_holst():
    canvas.delete("all")

def vo_vremya_risovaniya(event):
    if tekuschaya_figura == "svobodno":
        canvas.create_oval(
            event.x - tolschina, event.y - tolschina,
            event.x + tolschina, event.y + tolschina,
            fill=tekuschij_cvet, outline=tekuschij_cvet,
        )
        return
    # ... pozostałe kształty jak w sekcji 18.5
Prawdziwe płótno: pociągnięcie pojedynczych kółek z wyraźnymi przerwami między nimi
Prawdziwe płótno: okrąg dla każdego ruchu myszy – ostrym gestem można zobaczyć przerwy między nimi.
Oddzielne okręgi nie są jedną linią
Taki ruch nie rysuje linii ciągłej, lecz rozpraszanie małych kółek-kropek, które czasem nawet się nie stykają, jeśli mysz szybko przesuwa się między dwoma zdarzeniami <B1-Motion>. Rozdział 18.14 pokazuje, jak uzyskać prawdziwy ciągły rys – łącząc każdą nową kropkę z poprzednią.

Pierwszy Kompletny Program

Pełna wersja pierwszego prototypu, w tym poprawione rysowanie „szkicowych” figur podczas przeciągania myszą, jest dostępna jako osobny plik:

projects/tkinter/paint-app/paint_app_basic.py

Prawdziwe okno: płótno z kilkoma liniami, prostokątem i owalnym kolorem – pierwszy prototyp gry rysującej
Rzeczywiste okno pierwszego prototypu: kilka figur w różnych kolorach na jednym płótnie.
Szczera, ale nie ostateczna wersja
Stworzyliśmy prawdziwy działający program — z płótnem, kształtami, kolorem i grubością. Ale stan tutaj nadal istnieje w zmiennych globalnych, nic nie da się "cofnąć", a "przybliżony" kształt jest po prostu usuwany i odtwarzany podczas przeciągania i upuszczania. Zaczynając od następnej sekcji, rozdział znacznie dokładniej przygląda Canvas się: co faktycznie przechowuje, jak cofnąć akcję na rzeczywiste podstawy oraz jak wyhodować aplikację poziomu z tego prototypu PaintApp (Rozdział 18.32).
★★ Zadanie samodzielne
Przycisk anulowania

Zapisz id każdy narysowany kształt (canvas.create_* zwraca id) do lista — i dodaj przycisk, który usuwa ostatni po canvas.delete(id). Rozdział 18.24 rozbije ten pomysł jako prawdziwą architekturę.

Challenge
Zapisywanie zdjęcia

Przestudiuj moduł tkinter.filedialog i spróbuj dodać przycisk „Zapisz” — przynajmniej zapisujący lista narysowane figury do pliku tekstowego (rozdział 15). Rozdział 18.30 pokaże pełne rozwiązanie przez JSON.

Praktyka: Pierwszy kompletny program
Moduł tkinter otwiera natywne okno Python — wykonaj lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →

Streszczenie sekcji

Czego się nauczyliśmy

  • Canvas — widżet Tkinter do rysowania linii i figur według współrzędnych; współrzędne rosną w prawo i w dół od lewego górnego rogu.
  • canvas.create_line/rectangle/oval(...) rysują gotowe figury według współrzędnych.
  • Wydarzenia Myszy (<Button-1>, <B1-Motion>, <ButtonRelease-1>) śledzić kliknięcie, przeciąganie i puszczanie przycisku myszy.
  • Scale — suwak do wyboru liczby w zakresie.
  • Paleta z kilkoma podobnymi przyciskami jest efektywniej tworzona w pętli niż ręcznie jeden po drugim.
  • To dopiero pierwszy prototyp — wtedy rozdział znacznie dokładniej analizuje Canvas i architekturę aplikacji.