Grafika Pythonban

Kategória: Python.

Table of Contents

TK

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 értelmes 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 rajzok 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:

Turtle

A teknőcprogramozás gyerekeknek szánt grafikus felület, ahol alap mozgásokkal tudunk rajzolni. Példa:

from turtle import *
 
pensize(5)
pencolor('black')
fillcolor('yellow')
begin_fill()
for i in range(5):
    forward(100)
    left(72)
end_fill()
done()

(Adja magát, de ne turtle.py-ként nevezzük el, mert akkor nem fog működni.)

Ennek az oldalnak nem célja a teknőc logika részletes ismertetése, hanem csak inkább figyelemfelkeltés. További részleteket példákkal a https://docs.python.org/3/library/turtle.html oldalon olvashatunk; ezt a szakaszt is annak alapján készítettem.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License