Zamykanie obsługi programu w klasie

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

Na stronie Programowanie → Python - tkinter → Pierwsze okno w tkinter napisany został mały, prosty programik w sposób liniowy. Wielu programistów by mi zarzuciło, że wszystkie tam zawarte dane są dość luźno powiązane z sobą i że lepiej by było zamknąć to w jedną ładną zgrabną i powabną klasę. Toteż i z najdzikszą rozkoszą pokazuję jak to zrobić bardziej poprawnie, ale zanim to przytoczę z wcześniej wspominanej strony starą wersję programu

Listing 1
  1. import tkinter as tk # ładowanie modułu tkinter (w wersji 3+)
  2. window = tk.Tk() # tworzenie okna głównego
  3. window.title( "Hello World" ) # ustawienie tytułu okna głównego
  4. # tworzenie kontrolki typu label
  5. label = tk.Label( window, text = "Witaj Świecie programowania\nCo swym urokiem nas zabawia\nCo otwiera nowe możliwości\nZ binarnych liczb złożoności" )
  6. label.pack( side = tk.BOTTOM ) # podpinanie kontrolki pod okno
  7. tk.mainloop() # wywołanie pętli komunikatów

Nowa wersja (zamknięta w jednej definicji klasy) wyglądać będzie następująco:

Listing 2
  1. import tkinter as tk # ładowanie modułu tkinter (w wersji 3+)
  2. class HelloWorld:
  3. def __init__(self):
  4. self.window = tk.Tk() # tworzenie okna głównego
  5. self.window.title( "Hello World" ) # ustawienie tytułu okna głównego
  6. # tworzenie kontrolki typu label
  7. self.label = tk.Label( self.window, text = "Witaj Świecie programowania\nCo swym urokiem nas zabawia\nCo otwiera nowe możliwości\nZ binarnych liczb złożoności" )
  8. self.label.pack( side = tk.BOTTOM ) # podpinanie kontrolki pod okno
  9. self.window.mainloop() # wywołanie pętli komunikatów
  10. helloworld = HelloWorld()

Jak widać na powyższym przykładzie wszystkie dane zostały powiązane poprzez zamknięcie ich wewnątrz klasy HelloWorld.

Nieco bardziej zaawansowany przykład, związany z rysowaniem po kontrolce typu Canvas:

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

Komentarze