Kategória: Python.
A TK egy grafikus felület, amely független a Pythontól (eredendően a TCL programozási nyelv grafikus felülete volt), és noha egy független cég fejleszti, része az alap Python disztribúciónak.
Az alap TK ablak létrehozása "fájdalmasan egyszerű":
import tkinter as tk window = tk.Tk() window.mainloop()
Sőt, ha a Python parancssorból indítjuk, akkor a window.mainloop() sem kell. Érdemes összehasonlítani pl. a C++-szal, ahol különböző operációs rendszereken teljesen eltérő rendszereket kell írni, és pl. Windows-on "fél napig" tart feltelepíteni a függőségeket és szinte hónapokig kell tanulni, mielőtt bármi értelmeset tudunk produkálni. Vagy Java-ban a JavaFX okozta kínlódással is nagyon sok értékes óra elmegy, mire sikerült életre lehelni.
Lássunk valami "értelmeset"!
import tkinter as tk def button_click(): name = str(name_entry.get()) if name != "": greeting_label["text"] = f"Hello, {name}!" window = tk.Tk() window.title("TK example") name_frame = tk.Frame(window) name_label = tk.Label(master=name_frame, text="Name:") name_label.grid(column=0, row=0) name_entry = tk.Entry(master=name_frame) name_entry.grid(column=1, row=0) name_frame.pack() button = tk.Button(window, text="Click Me", command=button_click) button.pack() greeting_label = tk.Label(text="Hello!") greeting_label.pack() window.mainloop()
Ez a pár soros program tartalmazza a legfontosabb elemeket:
- A fő ablak létrehozását már láttuk. Itt beállítjuk a fejlécet is (setTitle()).
- A Frame elemeket kapcsol össze.
- A Label segítségével feliratokat tudunk elhelyezni.
- Az Entry egysoros beviteli mező.
- A Button nyomógomb. Itt célszerűen meg kell adnunk azt, hogy mi hajtódjon végre, amikor a felhasználó rákattint. Jelen esetben a button_click() függvény hívódik meg, ami beállítja az eggyel később létrehozott címke szövegét. Ez egyúttal példa arra is, hogy hogyan tudjuk az egyes GUI elemeket megváltoztatni.
Igen hasznos még a vászon (Canvas) GUI elem. Az alábbi példa egy 200x200-as vászon közepére rajzol egy kört, amit a nyilakkal lehet mozgatni. Ez egyúttal példát mutat arra is, hogy hogyan lehet a billentyű eseményeket lekezelni, valamit egy másik gyakori TK programozási gyakorlatra is: minden tkinter elemet beolvasunk, és közvetlenül használjuk azokat.
from tkinter import * def key_pressed(event): circle_coord = canvas.coords(circle) if event.keysym == 'Left' and circle_coord[0] > 0: canvas.move(circle, -2, 0) if event.keysym == 'Right' and circle_coord[0] <= 180: canvas.move(circle, 2, 0) if event.keysym == 'Up' and circle_coord[1] > 0: canvas.move(circle, 0, -2) if event.keysym == 'Down' and circle_coord[1] <= 180: canvas.move(circle, 0, 2) root = Tk() canvas = Canvas(root, width=200, height=200, bg='black') canvas.pack() circle = canvas.create_oval(90, 90, 110, 110, width=3, outline='black', fill='yellow') root.bind('<KeyPress>', key_pressed) root.mainloop()
A grafikus felülettel rendelkező programoknak van egy "objektum-orientáltabb" megoldása is. A fenti első példa ebben a formában az alábbi:
import tkinter as tk class Application(tk.Frame): def __init__(self, window=None): super().__init__(window) self.window = window self.pack() self.create_widgets() def button_click(self): name = str(self.name_entry.get()) if name != "": self.greeting_label["text"] = f"Hello, {name}!" def create_widgets(self): self.name_frame = tk.Frame(self.window) self.name_label = tk.Label(master=self.name_frame, text="Name:") self.name_label.grid(column=0, row=0) self.name_entry = tk.Entry(master=self.name_frame) self.name_entry.grid(column=1, row=0) self.name_frame.pack() self.button = tk.Button(self.window, text="Click Me", command=self.button_click) self.button.pack() self.greeting_label = tk.Label(text="Hello!") self.greeting_label.pack() Application(tk.Tk()).mainloop()
TODO: elrendezési lehetőségek, canvas koordináták, rádiógombot, checkboxok, többsoros szövegek stb.
Számos egyéb GUI elemet tudunk használni, és egyes GUI elemek attribútumait meg tudjuk változtatni. Ez a leírás csak ízelítőt adott a lehetőségekről, a téma további részletezése viszont meghaladná az erre szánt terjedelmet. Néhány oldal, amely segített ennek a szakasznak az elkészítésben, és továbblépésre hasznos:
- https://docs.python.org/3/library/tkinter.html: hivatalos dokumentáció
- https://realpython.com/python-gui-tkinter/: alapos leírás
- https://likegeeks.com/python-gui-examples-tkinter-tutorial/: kissé igénytelenebb, de az alapokat talán jobban leírja
- http://www.pythonlake.com/python/tkinter: részletes oldal sok példával
TODO: pygame (zene)