Python – tkinter mit Beispielen

Tkinter ist die De-facto-Methode in Python, um grafische Benutzeroberflächen (GUIs) zu erstellen.

Die Installation von Tkinter unter Windows ist genauso einfach wie die Installation von Python 3.x, da Tkinter im Python 3-Kern enthalten ist. Unter Gentoo-Linux muss das USE – Flag von Python angepasst werden.

Um zu überprüfen, ob Tkinter zum Laden durch Python installiert ist, führen Sie den folgenden Code in einer Python-Konsole aus: import tkinter

Falls dort kein Fehler erscheint ist es erfolgreich eingebunden.

Über den Befehl tkinter._test() kann ein Testbutton mit Systeminfos aufgerufen werden.

Ein einfaches Fenster wird durch folgende Befehle erstellt:

from tkinter import *

Das Modul wird importiert
Die Unterstützung für Tkinter ist auf mehrere Module verteilt. Die meisten Anwendungen benötigen das Hauptmodul tkinter sowie das Modul tkinter.ttk, das den modernen thematischen Widget-Satz und die API bereitstellt.

Was ist der Unterschied zwischen TK und TTK in Python?

Das ist der eigentliche Unterschied zwischen den beiden: Tkinter-Widgets sind konfigurierbarer und ttk ist moderner und kann mit Stilen konfiguriert werden, die wirklich praktische Verknüpfungen sind

Die erforderlichen Module werden importiert. Hier werden alle Module, die für tkinter bereit stehen importiert. Jedes GUI benötigt in Python ein Root-Fenster. Das Root-Fenster ist im Prinzip das Hauptfenster, das dann angepasst und erweitert werden kann. Nach Erstellung des Root-Fensters wird die Schleife mainloop eingefügt, damit das Fenster aktiv bleibt.


from tkinter import *
root = Tk()
root.mainloop()

from tkinter import *
from tkinter import ttk
root=Tk()
ttk.Button(root, text="Hallo World").grid()
root.mainloop()

Grid und Pack sind Geometriemanager
Verschiedene Layout- bzw. Geometriemanager dürfen in einem Programm nicht genutzt werden

Die Größe des Fensters wird über geometry festgelegt

# import all functions from the tkinter   
from tkinter import *
 

root=Tk()
root.title("Typeitin")
root.geometry("500x800")
root.mainloop()

Definition eines Labels

Ein Label ist ein Tkinter-Widget, das zum Anzeigen von Text oder Bildern in einer grafischen Benutzeroberfläche (GUI) verwendet wird. Es wird wie folgt definiert:

pythonlabel = tk.Label(master, option=value, ...)

Erklärung der Argumente:

  • master ist das übergeordnete Widget, in dem das Label platziert wird (normalerweise das Hauptfenster root).
  • option=value sind optionale Schlüsselwort-Argumente zum Konfigurieren des Labels, z.B.:
    • text="Hallo Welt" zum Setzen des Labeltexts
    • font=("Arial", 14) zum Setzen der Schriftart und Größe
    • fg="red" zum Setzen der Textfarbe
    • bg="yellow" zum Setzen der Hintergrundfarbe
    • image=photo zum Anzeigen eines Bildes anstelle von Text

Nachdem das Label definiert wurde, muss es mit einer Geometrie-Manager-Methode wie .grid() oder .pack() in das übergeordnete Widget eingefügt werden.

Nun wird ein Rahmen und ein Title festgelegt.

from tkinter import *
from tkinter import ttk
root=Tk()
root.title("bmi berechnen")
root.geometry('350x400')
ttk.Button(root, text="Hallo World").grid()
root.mainloop()

Das durch unser Skript erzeugte Fenster bleibt solange in der Ereignis-Schleife (Event loop) bis wir das Fenster schließen.

from tkinter import *
import tkinter as tk
def zeigen():
	print ("Der Button wurde geklickt")
root=tk.Tk()
# root window title and dimension
root.title("Einfacher Button")
root.geometry("380x400")
 
# creating button
btn = Button(root, text="Drücken", command=zeigen)
btn.pack()
 
# running the main loop
root.mainloop()

Button mit anderer Farbe

# import all functions from the tkinter   
from tkinter import *
 
# import messagebox class from tkinter
from tkinter import messagebox

def delete():
# whole content of text area widget is deleted
    TextArea.delete(1.0, END)

root=Tk()
root.title("Typeitin")
root.geometry("500x800")
#create a text area for the root
# with lunida 13 font
# text area is for writing the content
delete_Button = Button(root, text = "Löschen", fg = "Black", bg = "Red", command = delete)
delete_Button.pack()

TextArea = Text(root, height = 5, width = 25, font = "lucida 13")
TextArea.pack()
root.mainloop()

Text in Tkinter

Das Text-Widget wird verwendet, wenn ein Benutzer mehrzeilige Textfelder einfügen möchte. Dieses Widget kann für eine Vielzahl von Anwendungen verwendet werden, bei denen mehrzeiliger Text erforderlich ist, z. B. für Nachrichten, das Senden von Informationen oder das Anzeigen von Informationen und viele andere Aufgaben. Wir können auch Mediendateien wie Bilder und Links in das Textwidget einfügen.

Optionale Parameters 
 

root – Hauptfenster
bg – Hintergrundfarbe
fg – Vordergrundfarbe
bd – Rahmen des widget
height – Höhe des Widget
width – Breite des Widget
font – Schrift des Widgets
cursor – Der Typ des zu verwendenden Cursors.
insetofftime – Die Zeit in Millisekunden, für die das Blinken des Cursors ausgeschaltet ist.
insertontime – die Zeit in Millisekunden, für die der Cursor blinkt.
padx – horizontale Polsterung. 
pady – vertikale Polsterung. 
state – Definiert, ob das Widget auf Maus- oder Tastaturbewegungen reagiert.
highlightthickness – Definiert die Stärke des Fokus-Highlights.
insertionwidth – Definiert die Breite des Einfügezeichens.
relief – Art des Randes, die SUNKEN, RAISED, GROOVE und RIDGE sein kann.
yscrollcommand – um das Widget vertikal scrollbar zu machen.
xscrollcommand – um das Widget horizontal scrollbar zu machen.
 

Bitte die unterschiedlichen Layout-Manager beachten.

                                                                                       
from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Typeitin")
root.geometry('250x600')

T = Text(root, height=2, width=30)
T.pack()
T.insert(END, "Willkommen zu \n Typeitin")

message = Entry(root, width=10)
message.pack()  
message.insert(0, "")

ttk.Button(root, text="Eintrag hinzufügen").pack()

root.mainloop()
from tkinter import *
from tkinter import ttk

def addText():
    text_to_add = message.get()  # Den eingegebenen Text abrufen
    T.insert(END, text_to_add + "\n")  # Text zum Textfeld hinzufügen
    message.delete(0, END)  # Eingabefeld leeren

root = Tk()
root.title("Typeitin")
root.geometry('250x600')

T = Text(root, height=10, width=30)
T.pack()
T.insert(END, "Willkommen zu \nTypeitin\n")

message = Entry(root, width=10)
message.pack()  
message.insert(0, "")

# Create Go! Button
go_button = Button(root, text="GO!", command=addText, bg="#6FAFE7", width=15)
go_button.pack(pady=5)
ttk.Button(root, text="Eintrag hinzufügen").pack()

root.mainloop()

# import all functions from the tkinter   
from tkinter import *
 
# import messagebox class from tkinter
from tkinter import messagebox

def delete():
# whole content of text area widget is deleted
    TextArea.delete(1.0, END)

root=Tk()
root.title("Typeitin")
root.geometry("500x800")
#create a text area for the root
# with lunida 13 font
# text area is for writing the content
delete = Button(root, text = "Löschen", fg = "Black", bg = "Red", command = delete)

TextArea = Text(root, height = 5, width = 25, font = "lucida 13")
root.mainloop()
from tkinter import *

def create_button(event):
    new_button_text = entry.get()  # Hole den Eingabetext
    new_button = Button(root, text=new_button_text)
    new_button.place(x=event.x, y=event.y)

def ohne_Aenderung():
    print("ohne Änderung")

def Runde():
    print("Runde")

root = Tk()
root.bind("<Button-3>", create_button)
root.title("Typeitin")
root.geometry("300x200")

# Erstelle eine Eingabezeile für den Button-Text
entry = Entry(root)
entry.pack()

btn = Button(root, text="ohne Änderung", command=ohne_Aenderung)
btn.pack()

btn = Button(root, text="Runde", command=Runde)
btn.pack()

root.mainloop()


Wir erstellen eine Entry-Komponente mit entry = Entry(root) und fügen sie dem Fenster mit entry.pack() hinzu. Diese Komponente ermöglicht die Texteingabe. In der create_button-Funktion holen wir den Eingabetext mit new_button_text = entry.get() und verwenden diesen Text beim Erstellen des neuen Buttons: new_button = Button(root, text=new_button_text).

Speichern in einer Datei:

Eine Reaktion auf einen Mausklick definieren:

bind in Python ist dafür da, um Events (wie Mausklicks, Tastendrücke, etc.) mit Funktionen zu verknüpfen, die ausgeführt werden sollen, wenn dieses Event eintritt. Wenn du z.B. auf nen Button klickst oder ne Taste drückst, kannst du mit bind festlegen, welche Funktion dann aufgerufen wird.
Die Maustasten werden durch Nummern identifiziert. 1=Links, 2=Mitte, 3=Rechts

Einen Button zum Beenden des Fensters:

button = tk.Button (root, text='Beenden', width=25, command=root.destroy)
button.pack()

from tkinter import *
import tkinter as tk

def button_press(event):
    if event.num == 3:  # rechte Maustaste
        print("rechte Maus gedrückt")

        
root = tk.Tk()

eingabe=Label(root, text="Hier den einzufügenden Text eingeben")
eingabe_wert=tk.Entry(root)
eingabe_wert.pack()
eingabe.pack()
button = tk.Button(root, text='Beenden', width=25, command=root.destroy)
button.pack()

root.bind("<Button>", button_press)  # bindet das Mausklick-Event an die Funktion
#root.bind("Beenden", beenden)
root.mainloop()

Eine Eingabe abfragen

  • x = StringVar() # Enthält eine Variable vom Typ string; default value „“
  • x = IntVar() # Enthält eine Variable vom Typ integer; default value 0
  • x = DoubleVar() # Enthält eine Variable vom Typ float; default value 0.0
  • x = BooleanVar() # Enthält eine Variable vom Typ boolean, returns 0 for False und 1 for True

Um den aktuellen Wert einer solchen Variablen zu lesen, benutzt man die Methode get(). Die Zuweisung eines neuen Wertes erfolgt mittels der Methode set().

text = eingabefeld_wert.get()  # Hole den Text aus dem Eingabefeld
eingabefeld_wert = tk.StringVar()
eingabefeld = tk.Entry(root, textvariable=eingabefeld_wert)
eingabefeld.pack()
import tkinter as tk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox

def schreibe_in_datei():
        text = eingabefeld_wert.get()  # Hole den Text aus dem Eingabefeld
        with open("typeitin.txt", "a") as datei:
        datei.write(text + "\n")  # Füge eine Zeilenumbruch am Ende hinzu
        tkinter.messagebox.showinfo("Eintrag erfolgreich","Eintrag wurde hinzugefügt")
def callback():
    name = askopenfilename(master=root)

root = tk.Tk()
root.title("Typeitin")
root.geometry("300x500")

eingabefeld_wert = tk.StringVar()
eingabefeld = tk.Entry(root, textvariable=eingabefeld_wert)
eingabefeld.pack()



oeffnen = tk.Button(root, text='Datei öffnen', command=callback)
oeffnen.pack()

button = tk.Button(root, text="Schreibe in Datei", command=schreibe_in_datei)
button.pack()

root.mainloop()

Ein zusätzlicher Button wird hinzugefügt und gespeichert:

Python bietet ein eingebautes Modul namens json, mit dem wir JSON-Daten kodieren und dekodieren können. Der Prozess des Schreibens von JSON-Daten in eine Datei umfasst zwei Hauptschritte:

  1. Kodierung von Python-Daten in JSON: In diesem Schritt werden Python-Objekte in das JSON-Format konvertiert, so dass sie in einer Datei gespeichert werden können.
  2. Schreiben der kodierten JSON-Daten in eine Datei: Hier werden die JSON-Daten mithilfe der Dateiverarbeitungsfunktionen von Python in der Datei gespeichert.
import tkinter as tk
from tkinter.filedialog import askopenfilename
import tkinter.messagebox
import json

def schreibe_in_datei():
    text_eingabe = eingabefeld_wert.get()
    with open("typeitin.txt", "a") as datei:          
              datei.write(text_eingabe + "\n")
              tkinter.messagebox.showinfo("Eintrag erfolgreich", "Eintrag wurde hinzugefügt")

def callback():
    name = askopenfilename(master=root)

def rechtsklick(event):
    text_eingabe = eingabefeld_wert.get()
    button = tk.Button(button_container, text=text_eingabe)
    button.pack(fill=tk.X, padx=5, pady=2)
    
    buttons.append({"text": text_eingabe})
    save_buttons()

def save_buttons():
    with open("buttons.json", "w") as f:
        json.dump(buttons, f)

def load_buttons():
    try:
        with open("buttons.json", "r") as f:
            return json.load(f)
    except FileNotFoundError:
        return []

def create_saved_buttons():
    for button_info in buttons:
        button = tk.Button(button_container, text=button_info["text"])
        button.pack(fill=tk.X, padx=5, pady=2)

root = tk.Tk()
root.title("Typeitin")
root.geometry("300x500")

buttons = load_buttons()

eingabefeld_wert = tk.StringVar()
eingabefeld = tk.Entry(root, textvariable=eingabefeld_wert)
eingabefeld.pack(pady=5)

oeffnen = tk.Button(root, text='Datei öffnen', command=callback)
oeffnen.pack(pady=5)

button = tk.Button(root, text="Schreibe in Datei", command=schreibe_in_datei)
button.pack(pady=5)

button_container = tk.Frame(root)
button_container.pack(fill=tk.BOTH, expand=True)

root.bind("<Button-3>", rechtsklick)

create_saved_buttons()

root.mainloop()

Bei einem Rechtsklick soll die Möglichkeit gegeben werden, den neu erstellten Button wieder zu löschen: