python gui maken met tkinter tutorial

Wanneer je als data scientist bepaalde code herhaaldelijk uit wilt voeren kan het gemakkelijk zijn om dit vanuit een grafisch gebruikersinterface (GUI) te doen. Hier zijn vele mogelijkheden voor. Je kan het werken met Python in Jupyter Notebook als een gebruikersinterface zien. Andere voorbeelden zijn webapplicaties en opzichzelfstaande applicaties. Voor alle opties zijn mogelijkheden met Python. In dit blog bekijken we de toepassing van Tkinter. Dit is een package vanuit de standaard Python core waarmee gemakkelijk en snel opzichzelfstaande applicaties ontwikkeld kunnen worden.

Als case gaan we een applicatie maken waarin we een Excel bestand kunnen openen, en wat ons het aantal rijen, kolommen en de hoogste waarde uit het Excel bestand toont. Dit gaat er als volgt uitzien:

python tkinter tutorial voor grafische user interface

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.


Stap 1: Aanmaken van een venster

Als eerste stap maken we een simpel venster aan. Hiervoor importeren we Tkinter, maken een venster aan, geven dit een titel, en met 'window.mainloop()' zorgen we ervoor zodra de code uitgevoerd wordt het venster getoond wordt.

In [1]:
import tkinter as tk

window = tk.Tk()
window.title("Excel")

window.mainloop()

Wanneer je deze code uitvoert zie je het volgende venster:

python tkinter tutorial

Dit venster is uiteraard nog leeg.

Stap 2: Toevoegen van een raster met tekstlabels

We gaan tekstlabels toevoegen aan het venster waarin we de details over het aantal rijen, kolommen en de hoogste waarde weergeven. Binnen Tkinter zijn er meerdere mogelijkheden om de plaatsing van componenten zoals labels en knoppen te specificeren. Mogelijkheden zijn de '.pack()', 'place()' en '.grid()' methode. Hier gaan we gebruik maken van de .grid methode om de componenten volgens een raster te plaatsen.

We verdelen het venster met methoden '.columnconfigure()' en '.rowconfigure()' in rijen en kolommen. Hierbij kiezen we 1 kolom en 3 rijen, omdat we 3 tekstlabels onder elkaar willen plaatsen. Hierbinnen specificeren we met argument 'minsize' het minimale aantal pixels en dus de minimale afmetingen.

Vervolgens maken we 3 labels aan met 'tk.Label()' en plaatsen elk label in de juiste rij en kolom met '.grid()'.

In [2]:
import tkinter as tk

window = tk.Tk()
window.title("Excel")

# We verdelen het venster in een aantal kolommen en rijen
window.columnconfigure([0], minsize=20)
window.rowconfigure([0, 1, 2], minsize=20)

# Aanmaken van de labels
label_rows = tk.Label(text="Number of rows:")
label_columns = tk.Label(text="Number of columns:")
label_max = tk.Label(text="Highest value:")

# Plaatsen van de labels in een rij / kolom
label_rows.grid(row=0, column=0)
label_columns.grid(row=1, column=0)
label_max.grid(row=2, column=0)

window.mainloop()

Wanneer je deze code uitvoert zie je het volgende venster:

voorbeeld tkinter window

We hebben succesvol de labels geplaatst binnen het venster. Dit ziet er alleen niet netjes uitgelijnd en wat druk uit. Om dit te verbeteren voegen we bij de plaatsing van de labels de volgende parameters toe: 'sticky="w", padx=5, pady=5'. Met 'sticky="w"' geven we aan dat de uitlijning in het westen is (links). Met 'padx' en 'pady' geven we wat extra ruimte, padding, rondom de labels.

In [3]:
import tkinter as tk

window = tk.Tk()
window.title("Excel")

window.columnconfigure([0], minsize=20)
window.rowconfigure([0, 1, 2], minsize=20)

label_rows = tk.Label(text="Number of rows:")
label_columns = tk.Label(text="Number of columns:")
label_max = tk.Label(text="Highest value:")

# Uitlijnen met argument 'sticky' en ruimte rondom met 'padx' en 'pady'
label_rows.grid(row=0, column=0, sticky="w", padx=5, pady=5)
label_columns.grid(row=1, column=0, sticky="w", padx=5, pady=5)
label_max.grid(row=2, column=0, sticky="w", padx=5, pady=5)

window.mainloop()

Wanneer je deze code uitvoert zie je het volgende resultaat:

tkinter python window

Dit oogt al veel beter.

Stap 3: Toevoegen van een knop (button)

Nu is het tijd om de knop (button) toe te voegen waarmee een bestand geopend zal gaan worden. We kennen nu 'tk.Label()' al om een label te maken, voor een knop is dit 'tk.Button()'. In onderstaande code voegen we in 'window.rowconfigure()' een extra rij toe voor de knop, maken de knop aan met 'tk.Button()' en plaatsen deze met '.grid()' in de juiste rij.

In [4]:
import tkinter as tk

window = tk.Tk()
window.title("Excel")

window.columnconfigure([0], minsize=20)
# Toevoegen van een extra rij voor de knop
window.rowconfigure([0, 1, 2, 3], minsize=20)

label_rows = tk.Label(text="Number of rows:")
label_columns = tk.Label(text="Number of columns:")
label_max = tk.Label(text="Highest value:")
# Aanmaken van de knop
button_open = tk.Button(text='Open Excel file', width=20)

label_rows.grid(row=0, column=0, sticky="w", padx=5, pady=5)
label_columns.grid(row=1, column=0, sticky="w", padx=5, pady=5)
label_max.grid(row=2, column=0, sticky="w", padx=5, pady=5)
# Plaatsen van de knop
button_open.grid(row=3, column=0, padx=5, pady=5)

window.mainloop()

Wanneer je deze code uitvoert zie je het volgende resultaat:

python tkinter button

Mooi, de knop is toegevoegd. Er gebeurt alleen nog niets wanneer je op de knop klikt.

Stap 4: Toewijzen van een functie aan de knop

Nu we de knop aam het venster hebben toegevoegd kunnen we hier een functie aan toewijzen. Dit kan door in 'tk.Button()' vanuit argument 'command' naar een functie te verwijzen.

In onderstaande code doen we het volgende:

  • We voegen in 'tk.Butto()' argument 'command=open_excel_file' toe, dit verwijst naar een functie
  • Omdat er nog geen functie met de naam 'open_excel_file' is, maken we deze aan
  • In deze functie verkrijgen we een bestandslocatie van een bestand met behulp van methode 'askopenfilename', dit is een specifieke methode die we vanuit Tkinter importeren
  • Binnen de functie willen we specifiek Excel files openen, dit benoemen we
  • Wanneer er geen bestand gekozen wordt beëindigt de functie
In [5]:
import tkinter as tk
# Importeren van de methode om een bestand te openen
from tkinter.filedialog import askopenfilename

# De functie die aangeroepen wordt om een bestand te openen
def open_exel_file():
    filepath = askopenfilename(
        filetypes=[("Excel", "*.xlsx"), ("All Files", "*.*")]
    )
    if not filepath:
        return   

window = tk.Tk()
window.title("Excel")

window.columnconfigure([0], minsize=20)
window.rowconfigure([0, 1, 2, 3], minsize=20)

label_rows = tk.Label(text="Number of rows:")
label_columns = tk.Label(text="Number of columns:")
label_max = tk.Label(text="Highest value:")
# Toevoegen van 'command=open_exel_file' waarmee de een functie wordt aangeroepen
button_open = tk.Button(text='Open Excel bestand', width=20, command=open_exel_file)

label_rows.grid(row=0, column=0, sticky="w", padx=5, pady=5)
label_columns.grid(row=1, column=0, sticky="w", padx=5, pady=5)
label_max.grid(row=2, column=0, sticky="w", padx=5, pady=5)
button_open.grid(row=3, column=0, padx=5, pady=5)

window.mainloop()

Wanneer je dit Python script uitvoert zie je het volgende resultaat:

Dit werkt goed, er gebeurt alleen nog niets wanneer we een Excel bestand openen. Hiervoor moet extra logica toegevoegd worden.

Met vertrouwen waardevolle inzichten halen uit data? Schrijf je in voor een van onze trainingen.


Stap 5: Toevoegen van extra logica

We kunnen nu een bestand kiezen om te openen maar hier gebeurt nog niets mee. We willen dat details van het gekozen Excel bestand getoond gaan worden in de labels: het aantal rijen, kolommen en de hoogste waarde.

Hiervoor doen we het volgende:

  • In de functie 'open_excel_file()' voegen we logica toe nadat een bestand gekozen is
  • We openen het gekozen Excel bestand met behulp van package Pandas, wat we hiervoor ook moeten importeren
  • Vervolgens bepalen we met een hulpfunctie die we aanmaken ('get_number_rows_columns()') het aantal rijen en kolommen
  • Vervolgens bepalen we met een hulpfunctie die we aanmaken ('get_highest_value()') de hoogste waarde in het bestand
  • Tot slot updaten we met een hulpfunctie ('update_labels()') die we aanmaken de labelteksten zodat de juiste informatie getoond wordt
In [6]:
# Importeren van package Pandas
import pandas as pd
import tkinter as tk
from tkinter.filedialog import askopenfilename

def open_exel_file():
    filepath = askopenfilename(
        filetypes=[("Excel", "*.xlsx"), ("All Files", "*.*")]
    )
    if not filepath:
        return  
    # Open van het Excel bestand wat gekozen is
    df = pd.read_excel(filepath)
    # Verkrijgen van aantal rijen en kolommen
    n_rows, n_columns = get_number_rows_columns(df)
    # Verkrijgen van de maximale waarde
    max_value = get_highest_value(df)
    # Updaten van de labels
    update_labels(n_rows, n_columns, max_value)

# Hulpfunctie voor het verkrijgen van het aantal rijen en kolommen
def get_number_rows_columns(df):
    shape = df.shape
    n_rows = shape[0]
    n_columns = shape[1]
    return n_rows, n_columns
    
# Hulpfunctie voor het verkrijgen van de maximale waarde
def get_highest_value(df):
    max_value = df.max().max()
    return max_value

# Hulpfunctie om de labels te updaten
def update_labels(n_rows, n_columns, max_value):
    label_rows["text"] = f"Number of rows: {n_rows}"
    label_columns["text"] = f"Number of columns: {n_columns}"
    label_max["text"] = f"Highest value: {max_value}"
    
window = tk.Tk()
window.title("Excel")

window.columnconfigure([0], minsize=20)
window.rowconfigure([0, 1, 2, 3], minsize=20)

label_rows = tk.Label(text="Number of rows:")
label_columns = tk.Label(text="Number of columns:")
label_max = tk.Label(text="Highest value:")
button_open = tk.Button(text='Open Excel file', width=20, command=open_exel_file)

label_rows.grid(row=0, column=0, sticky="w", padx=5, pady=5)
label_columns.grid(row=1, column=0, sticky="w", padx=5, pady=5)
label_max.grid(row=2, column=0, sticky="w", padx=5, pady=5)
button_open.grid(row=3, column=0, padx=5, pady=5)

window.mainloop()

Wanneer je deze code uitvoert en een Excel bestand opent zie je het volgende resultaat:

python tkinter tutorial voor grafische user interface

De applicatie werkt nu zoals we voor ogen hadden: we kunnen Excel bestanden openen en daarvan details weergeven. Om deze applicatie uit te voeren is het installeren van Python vereist. Je kunt dit ook gemakkelijk omzetten naar een gemakkelijk te delen applicatie waarbij de gebruikers geen Python hoeven te installeren. Dit kun je bijvoorbeeld met package PyInstaller doen.

Wat je moet onthouden

Met Tkinter kun je gemakkelijk een interactieve gebruikersinterface maken waarmee je Python logica uit kunt voeren. Het is onderdeel van de standaard Python core. Er zijn vele mogelijkheden, je kunt bijvoorbeeld schermen en frames aanmaken waaraan je met verschillende objecten zoals knoppen en tekst kan toevoegen. Om met een gemaakte Tkinter applicatie te kunnen werken is Python nodig. Je kunt er ook een installeerbare applicatie van maken om het te delen met gebruikers die geen Python gebruiken, kijk hiervoor naar package PyInstaller.

Wil jij Python leren?

Wil je nog veel meer leren over Python en Data Science? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, of voor onze data science opleiding en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.

Download één van onze opleidingsbrochures voor meer informatie

by: