Python-Tk: Ein Neofetch-GUI selbst schreiben Teil 4

  Actionschnitzel   Lesezeit: 9 Minuten  🗪 3 Kommentare Auf Mastodon ansehen

Der vierte Teil einer Einführung in die Python3-Bibliothek Tkinter und der lange Weg zum perfekten GUI.

python-tk: ein neofetch-gui selbst schreiben teil 4

Ihr habt bestimmt schon einmal von der Abkürzung UI (User Interface / Benutzeroberfläche) gehört. Genau das machen wir hier. Wir bauen ein Tool mit grafischer Oberfläche. Was man nicht so oft hört, ist "UX". Gemeint ist User Experience – das Nutzungserlebnis.

Wir könnten genau genommen jeden Ablauf, der auf einem Betriebssystem grafisch dargestellt wird, jedem Terminal-Kommando eine GUI mit Tkinter geben. Am Ende entscheidet aber die "UX", wie viele Menschen euer Tool gut finden.

Ein Beispiel aus der Windows-Welt:

Ich habe ab Windows 95 jedes Windows bis Win10 mitgemacht. Die achte Inkarnation hat einen kompletten Bruch mit der uns bekannten Oberfläche bedeutet. In Windows 10 gab es plötzlich die altbekannte Systemsteuerung und eine weitere, die sehr glatt gebügelt aussieht. Das war für mich als Nutzer eine Vollkatastrophe. Zwei Fenster, die das Gleiche machen: das alte, das im Startmenü vergraben ist, und das neue, das schnell über ein Zahnrad erreichbar war, aber so unintuitiv wie die Wegbeschreibung zu Bäckerei von einem Passanten, der sich gar nicht im Dorf auskennt.

Was lernen wir als angehende GUI-Entwickler daraus?

  1. Ein konsistentes Erscheinungsbild ist wichtig.
  2. So einfach wie möglich halten.
  3. Neue Ideen sollten gut geplant und durchdacht werden.
  4. Jemand hat immer ein Problem mit unserem Tool, egal, wie gut es durchdacht ist.

Wir haben also ein Fenster mit den Maßen 800 × 500. In diesem Fenster sind zwei Frames nebeneinander. Im linken befindet sich ein Bild.

Denken

Wie schon im ersten Teil erwähnt, besteht ein Großteil beim Programmieren aus Denken. Nachdem wir jetzt schon einen kleinen Erfolg verbuchen konnten, schauen wir kritisch auf unser Werk.

  1. Der logo_frame nimmt zu viel Platz ein.
  2. Unser Testbild ist direkt mittig des Frames am Fensterrand positioniert.
  3. Obwohl das PNG eine Transparenz-Ebene hat, ist der Hintergrund grau
  4. Farblich stimmt hier gar nichts

Platz ausnutzen

Unser Icon verankern wir mit `anchor` im Nord-Westen des Frames

distro_icon.pack(anchor=tk.NW)

Um mehr Platz für unsere System-Daten im stat_frame zu erhalten, nehmen wir folgende Änderungen vor:

logo_frame.pack(fill="both",expand=False,side='left')

Abstand halten

Wie wir sehen sind die beiden Frames so expandiert, dass sie bis an die Ränder des Fensters reichen. Das sieht nicht sehr schön aus. Um das zu regulieren, nutzen wir `padx` und `pady`. Ich wähle hier einen Wert von `10`. Ob das für das letztendliche Erscheinungsbild passt, ist aber noch nicht klar. Um das Ergebnis besser ersichtlich zu machen, setzten wir die Variable `background="yellow"` in `distro_icon`

# Einen Frame Zeichen
logo_frame = tk.Frame(root,background="yellow")
logo_frame.pack(fill="both",expand=False,side='left',padx=10,pady=10)
# Distro-Logo-Label
distro_icon = tk.Label(logo_frame,text="DISTRO LOGO",image=distro_logo,background="yellow")
distro_icon.pack(anchor=tk.NW)
# Einen Frame Zeichen
stat_frame = tk.Frame(root,background="cyan")
stat_frame.pack(fill="both",expand=True,side='left',padx=10,pady=10)

 

Das Gelernte anwenden

Ihr könnt so viele Tutorials nachmachen, wie Ihr wollt, doch ob danach etwas Eigenes entstehen kann, hängt an einem einzigen Begriff:

Transferleistung 

Was ich damit mein? Nun, ich habe hier ein Pythonbuch herumliegen, die Rückseite besagt: "Der leichte Weg zum Experten!". Nachdem ich das Buch durchgearbeitet habe, ist mir aber aufgefallen, dass ich nur in der Lage bin, das im Buch beschrieben Warenwirtschaftssystem zu programmieren.

Und hier liegt das Problem. Wenn ihr wirklich etwas Eigenes erschaffen wollt, müsst ihr viel lesen, lernen und vor allem verstehen. Wissen, das ihr erworben habt, kann auch in anderen Bereichen von Tkinter angewendet werden.

Zum rechten Frame

Wir erstellen zwei Labels. Eines für `USER@Host` und eines für `OS`. Das sieht dann so aus:

Im Text platzieren wir die Labels unter `stat_frame`.

stat_frame = tk.Frame(root,background="cyan")
stat_frame.pack(fill="both",expand=True,side='left',padx=10,pady=10)

user_host_label = tk.Label(stat_frame,text="USER@HOST")
user_host_label.pack()

user_host_label = tk.Label(stat_frame,text="OS:")
user_host_label.pack()

Logik

  • `.pack()` platziert, wenn nicht anders definiert, die Widgets in der Reihenfolge, wie sie im Code auftauchen.

Auch hier können wir `anchor` nutzen:

user_host_label = tk.Label(stat_frame,text="USER@HOST")
user_host_label.pack(anchor=tk.NW)

user_host_label = tk.Label(stat_frame,text="OS:")
user_host_label.pack(anchor=tk.NW)

Der ganze Code

## Teil 4 ###
import tkinter as tk
from PIL import Image, ImageTk

# Erstelle das Hauptfenster
root = tk.Tk()
root.title("Neofetch-Tk")
root.geometry("800x500")

distro_logo = tk.PhotoImage(file="images/test.png")

# Einen Frame Zeichen
logo_frame = tk.Frame(root,background="yellow")
logo_frame.pack(fill="both",expand=False,side='left',padx=10,pady=10)
# Distro-Logo-Label
distro_icon = tk.Label(logo_frame,text="DISTRO LOGO",image=distro_logo,background="yellow")
distro_icon.pack(anchor=tk.NW)
# Einen Frame Zeichen
stat_frame = tk.Frame(root,background="cyan")
stat_frame.pack(fill="both",expand=True,side='left',padx=10,pady=10)

user_host_label = tk.Label(stat_frame,text="USER@HOST")
user_host_label.pack(anchor=tk.NW)

user_host_label = tk.Label(stat_frame,text="OS:")
user_host_label.pack(anchor=tk.NW)

# Starte die Hauptschleife
root.mainloop()

Für heute war’s das. Wie immer gilt: Spielt mit den Variablen herum. Es gibt noch andere Himmelsrichtungen als `tk.NW`.

Der ganze Code auf Github

Im 5. Teil füllen wir die beiden neuen Label mit Informationen.

Tags

Tkinter, Python, GUI-Anwendung, Linux, Neofetch

Klaus
Geschrieben von Klaus am 21. Juni 2024 um 14:11

Ich mag den Kurs.

dreamon
Geschrieben von dreamon am 23. Juni 2024 um 13:25

Find ich Super !! Einfach weitermachen.. am Besten bis zum Teil 1000 ;-)

Actionschnitzel
Geschrieben von Actionschnitzel am 23. Juni 2024 um 14:19

Danke für den Zuspruch, auch unter den vorangegangenen Teilen. Wie viele Teile es werden, kann ich absolut nicht sagen, es werden aber viele. Um das nochmal alles zu erläutern: Die Serie ist so konzipiert, dass sie abbildet, wie ich Python gelernt habe. Von simpel zu kompliziert. Wenn fortgeschrittene "Pythonista" Fehler entdecken, dann liegt das daran, dass diese absichtlich eingebaut sind. Das dient dann auch als Ansatz für Erklärungen.