Zamykanie obsługi programu w klasie

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 4102 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()
Propozycje książek