Zdarzenia i powiązania w tkinter

Stronę tą wyświetlono już: 292 razy

Zdarzenia są powiązane z wywoływaniem pewnej funkcji, która przyjmuje określone parametry w odpowiedzi na określone zdarzenie. Aby taka odpowiedź mogła zostać wygenerowana, trzeba jakąś funkcję lub metodę obiektu jakiejś klasy powiązać z danym zdarzeniem. Pewne przykłady były już pokazywane na wcześniejszych stronach, oto jeden z nich:

Listing 1
  1. class CanvasDrawing:
  2. def __init__(self):
  3. self.window = tk.Tk()
  4. self.window.title("Rysowanie")
  5. self.window.geometry("500x500")
  6. self.canvas = tk.Canvas(self.window, width = 450, height = 450) # tworzę kontrolkę typu Canvas
  7. self.canvas.place( x= 25, y = 25) # umieszczam ją na ekranie
  8. self.canvas.create_rectangle((0, 0, 450, 450), fill="#ffffff", width = 0) # rysuję biały prostokąt
  9. self.canvas.bind("<B1-Motion>", self.draw) # podpinam zdarzenie pod kontrolkę
  10. self.window.mainloop()
  11. def draw(self, event): # metoda, którą podepnę pod zdarzenie ruchu myszki nad kontrolką canvas z wciśniętym lewym przyciskiem myszy
  12. self.canvas.create_oval((event.x - 2), (event.y - 2), (event.x + 2), (event.y + 2)) # tworzę okrąg na kontrolce canvas przy każdym ruchu myszką
  13. can = CanvasDrawing()

Wynikiem działania powyższego kodu, otrzymuje się okno programu z obiektem klasy Canvas, do którego podpięte została metoda draw (linijka 15) co dzieje się za pomocą metody bind obiektu canvas (linijka 13). Dzięki temu możliwe jest rysowanie po tejże kontrolce w odpowiedzi na ruch myszki z wciśniętym lewym przyciskiem myszy.

Przykład podpięcia pod kontrolkę canvas zdarzenia ruchu myszki z wciśniętym lewym przyciskiem
Rys. 1
Przykład podpięcia pod kontrolkę canvas zdarzenia ruchu myszki z wciśniętym lewym przyciskiem

Lista formatów zdarzeń

Oto lista formatów możliwych zdarzeń do podpięcia pod dowolną kontrolkę za pomocą metody binds:

  • <Button-1> - lewy przycisk myszki został wciśnięty, gdy pod to zdarzenie podpięta zostanie metoda lub funkcja to funkcja ta otrzymuje informacje, o tym że przycisk ten został wciśnięty. Metoda lub funkcja powinna przyjmować jeden argument, w którym zawarte będą współrzędne kursora myszki. Dla środkowego przycisku myszy odpowiednim zdarzeniem jest <Button-2> i <Button-3> dla prawego przycisku myszy;
  • <B1-Motion> - gdy myszka się przemieszcza i lewy przycisk myszy jest wciśnięty. Dla środkowego przycisku <B2-Motion> a dla prawego <B3-Motion>;
  • <ButtonRelease-1> - lewy przycisk myszki został zwolniony, odpowiednio dla środkowego przycisku myszy jest <ButtonRelease-2> i <ButtonRelease-3> dla przycisku prawego;
  • <Double-Button-1> - lewy przycisk myszy został wciśnięty dwukrotnie w krótkim odstępie czasu, (istnieje też opcja z potrójnym kliknięciem, wystarczy Double zamienić na Triple). Odpowiednikiem dla środkowego przycisku myszy jest <Double-Button-2> i dla przycisku prawego <Double-Button-3>;
  • <Enter> - wskaźnik myszy znalazł się nad obszarem kontrolki;
  • <Leave> - kursor myszy opuścił obszar kontrolki;
  • <FocusIn> - kontrolka otrzymała fokus (obsługę klawiatury);
  • <FocusOut> - kontrolka straciła fokus;
  • <Return> - wciśnięto przycisk enter. Inne specjalne nazwy przycisków to: Shift_L, Shift, Control_L, Control, Alt_L, Alt, Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock i Scroll_Lock;
  • <Key> - użytkownik wcisnął dowolny przycisk klawiatury, wartość klawisza wciśniętego jest zwracana jako char w argumencie funkcji obsługującej to zdarzenie;
  • a - użytkownik wcisną przycisk a na klawiaturze. Większość drukowalnych znaków jest tak obsługiwana, wyjątkiem jest spacja <space> oraz znak mniejsze niż <less>;
  • <Shift-Up> - gdy użytkownik wcisną przycisk strzałki w górę razem z shiftem. Możliwe jest również wykorzystanie prefiksu Alt, Shift i Control;
  • <Configure> - gdy kontrolka zmienia rozmiar. Nowy rozmiar kontrolki jest przekazywany jako width i height;

Atrybuty klasy Event

Każda metoda lub funkcja podpięta pod wyżej wymienione formaty zdarzeń musi przyjmować jeden argument, który jest obiektem klasy Event. Atrybuty tej klasy są następujące:

  • widget - kontrolka, która wygenerowała to zdarzenie (tą wartość uzyskują wszystkie zdarzenia);
  • x, y - położenie kursora myszki w momencie wywołania zdarzenia;
  • x_root, y_root - położenie kursora myszki w odniesieniu do górnego lewego narożnika okna rodzica kontrolki;
  • char - kod znaku wciśniętego przez użytkownika (wywoływane jedynie przez zdarzenia związane z klawiaturą);
  • keysym - symbol znaku (tylko dla zdarzeń związanych z klawiaturą);
  • keycode - kod znaku (tylko dla zdarzeń związanych z klawiaturą);
  • num - numer przycisku myszy (tylko dla zdarzeń związanych z przyciskami myszki);
  • width, height - nowe wymiary kontrolki w pikselach (tylko dla zdarzenia Configure);
  • type - typ zdarzenia

Komentarze