Zamykanie obsługi programu w klasie
Stronę tą wyświetlono już: 926 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
- import tkinter as tk # ładowanie modułu tkinter (w wersji 3+)
- window = tk.Tk() # tworzenie okna głównego
- window.title( "Hello World" ) # ustawienie tytułu okna głównego
- # tworzenie kontrolki typu label
- 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" )
- label.pack( side = tk.BOTTOM ) # podpinanie kontrolki pod okno
- tk.mainloop() # wywołanie pętli komunikatów
Nowa wersja (zamknięta w jednej definicji klasy) wyglądać będzie następująco:
- import tkinter as tk # ładowanie modułu tkinter (w wersji 3+)
- class HelloWorld:
- def __init__(self):
- self.window = tk.Tk() # tworzenie okna głównego
- self.window.title( "Hello World" ) # ustawienie tytułu okna głównego
- # tworzenie kontrolki typu label
- 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" )
- self.label.pack( side = tk.BOTTOM ) # podpinanie kontrolki pod okno
- self.window.mainloop() # wywołanie pętli komunikatów
- 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:
- import tkinter as tk
- class CanvasDrawing:
- def __init__(self):
- self.window = tk.Tk()
- self.window.title("Rysowanie")
- self.window.geometry("500x500")
- self.canvas = tk.Canvas(self.window, width = 450, height = 450) # tworzę kontrolkę typu Canvas
- self.canvas.place( x= 25, y = 25) # umieszczam ją na ekranie
- self.canvas.create_rectangle((0, 0, 450, 450), fill="#ffffff", width = 0) # rysuję biały prostokąt
- self.canvas.bind("<B1-Motion>", self.draw) # podpinam zdarzenie pod kontrolkę
- self.window.mainloop()
- def draw(self, event): # metoda, którą podepnę pod zdarzenie ruchu myszki nad kontrolką canvas z wciśniętym lewym przyciskiem myszy
- 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ą
- can = CanvasDrawing()