Sorry, Bild fehlt

IT Wissenssplitter

Sherlock und Desiderat

Sorry, Bild fehlt

PYTHON - Sherlocks Spickzettel zu Python 3.X


Bücher, die geholfen haben...

Einstieg in Python - von Thomas Theis
5. Auflage - Rheinwerk Computing / Rheinwerk Verlag GmbH
ISBN 978-3-8362-4525-8

Python 3 - von Johannes Ernesti, Peter Kaiser
6. aktualisierte Auflage 2020, 2. korrigierter Nachdruck 2021
Rheinwerk Computing / Rheinwerk Verlag
ISBN 978-3-8362-7926-0

Python - Der Grundkurs - von Michael Kofler
1. Auflage 2019
Rheinwerk Computing / Rheinwerk Verlag
ISBN 978-3-8362-6679-6

Python - GE-PACKT - von Michael Weigend
6. Auflage 2015
Rheinwerk Computing / Rheinwerk Verlag
ISBN 978-3-8226-8726-6

Raspberry Pi programmieren mit Python - von Michael Weigend
3. Auflage - mitp Verlag
ISBN 978-3-95845-429-3

Quellen im Internet

Dokumentationen im Internet

https://docs.python.org/3/
https://www.python-kurs.eu/python3_kurs.php
https://openbook.rheinwerk-verlag.de/python/


Dokumentation zur grafischen Benutzeroberfläche mit tkinter
https://docs.python.org/3/library/tkinter.html

Online-Kurse
https://open.hpi.de/courses/python2024
Sicherlich nicht nur für KIDS und Jugendliche
https://open.hpi.de/courses/pythonjunior-schule2024

Fallstricke bei der Programmierung in Python

Das Einrücken

Programmblöcke werden in Python durch Einrücken gebildet.

Wichtig ist jedoch, dass man entweder mit einem TAB arbeitet oder mit Leerzeichen.

Hilfreich ist die Verwendung eines entsprechenden Editors, der dieses grafisches darstellen kann.

Import von Modulen

Die Programmiersprache Python lebt vom modularen Aufbau.
Module müssen gegebenenfalls importiert werden. Möglich wäre zum Beispiel ein Import von tkinter wie folgt: from tkinter import * Das wird in dieser Dokumentation auch an der einen oder anderen Stelle so gemacht, das könnte aber zu Problemen führen. Sicherer ist der Import wie folgt: import tkinter Dazu gibt es weiter unten ein durchgängiges Beispiel. Ich empfehle den nachfolgenden Link für tiefere Einblicke in das Thema Import: https://openbook.rheinwerk-verlag.de/python/20_001.html#u20.1

Arbeiten mit Strings (Zeichenketten)

Abschnitt eines Strings (einer Zeichenkette)

zeichenkette = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# Erstes Zeichen bis ...
abschnittAnfang = zeichenkette[:3]
# Ergebnis = ABC

# Abschnitt einer Zeichenkette, gezählt vom Anfang
#
abschnittMitte = zeichenkette[3:7]
# Ergebnis = DEFG

# Abschnitt einer Zeichenkett vom Ende gezählt
#
abschnittMitteZwei = zeichenkette[-14:-6]
# Ergebnis = MNOPQRST

# Abschnitt von Zeichen ab angegebener Position bis zum letzten Zeichen
#
abschnittEnde = zeichenkette[16:]
# Ergebnis = QRSTUVWXYZ

Länge einer Zeichenkette

zeichenkette = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
laenge = len(zeichenkette)
print("Die Länge der Zeichenkette ist: ", laenge)

Suchen in einem String / in einer anderen Zeichenkette

zeichenkette = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(zeichenkette.find("JKL"))
# Ergebnis = 9

print(zeichenkette.find("JLK"))
# Ergebnis = -1

Zeichenkette am bestimmten Zeichen zerlegen

zeichenkette = "abc;def;ghi"
segmente = zeichenkette.split(";")

if len(segmente) > 0:
    n = 0
    while n < len(segmente):
        print("N: " + str(n) , segmente[n])
        n = n + 1

Zeichenkette (String) mit einem bestimmten Zeichen erweitern

# Zeichenkette mit .ljust(anzahl) bzw. .ljust(anzahl,zeichen)
# links anordnen und gegebenenfalls mit Zeichen am Ende auffuellen
#
# Hinweis: Ohne Angabe eines Zeichens wird ein Leerzeichen verwendet.

zeichenkette = "abcdefghi"
neueZeichenkette = zeichenkette.ljust(15,"-")
print(neueZeichenkette)

# Ergebnis: abcdefghi------


# Zeichenkette mit .rjust(anzahl) bzw. .rjust(anzahl,zeichen)
# rechts anordnen und gegebenenfalls mit Zeichen am Anfang auffuellen

zeichenkette = "abcdefghi"
neueZeichenkette = zeichenkette.rjust(15,"-")
print(neueZeichenkette)

# Ergebnis: ------abcdefghi


# Zeichenkette mit .center(anzahl) bzw. .center(anzahl,zeichen)
# mittig anordnen und gegebenenfalls mit Zeichen am Anfang und Ende auffuellen

zeichenkette = "abcdefghi"
neueZeichenkette = zeichenkette.center(15,"-")
print(neueZeichenkette)

# Ergebnis: ---abcdefghi---

Veränderbare Liste

Leere Liste anlegen

leere_liste = []

Element an Liste anhängen

# neue leere Liste anlegen
neue_liste = []

# Ein neues Element anhängen
neue_liste.append(1)

# noch ein Element anhängen
neue_liste.append("Test")

Liste gleich mit mehreren Elementen anlegen

liste_eins = [1, 2, 3]
liste_zwei = ["a","b","c"]
liste_drei = [1,"z",5]

Element aus Liste entfernen

# listenname.pop(n) entfernt das Element n aus der Liste und gibt dieses zurück

liste_vier = [2,"a","Ende"]
entferntes_element = liste_vier.pop(0)
print(entferntes_element)

# gibt 2 zurück


Tuple - eine unveränderbare Liste

Eine unveränderbare Liste anlegen

unveraenderbare_Liste = (2,"a","letstes")

Die Länge eines Tuple ermitteln

unveraenderbare_Liste = (2,"a","letstes")
laenge = len(unveraenderbare_Liste)

# Ergebnis: 3

Ein Tuple in eine Liste umwandeln

unveraenderbare_Liste = (2,"a","letstes")
neueListe = list(unveraenderbare_Liste)

Verzweigung und Schleife

Verzweigung (IF - ELSE): Wenn, dann ...

n = 1

if n==1:
    print("n hat den Wert 1)
else:
    print("n hat nicht den Wert 1")

Eine WHILE-Schleife

n = 1

while n < 5:
    print("N: ", n)
    n = n + 1

Verzeichnisse und Dateien

Einen Pfad zuweisen (hier unter dem Betriebssystem LINUX)

pfad = "\\home\\pi"
oder einfacher
pfad = r"\home\pi"

Einen Pfad und einen Dateinamen zusammensetzen

import os

pfad = "\\home\\pi\\Projekte\\Python"
dateiname = "test.txt"
pfadUndDateiname = os.path.join(pfad, dateiname)

Prüfen, ob eine bestimmte Datei existiert und Reaktion darauf, wenn das nicht der Fall ist

Empfohlene Links:
https://www.tutorialspoint.com/python/tk_messagebox.htm
https://docs.python.org/3.9/library/tkinter.messagebox.html
https://docs.python.org/3/library/sys.html

import os
import sys

from tkinter import messagebox

if not os.path.exists(pfadUndDateiname):
    messagebox.showerror("Fehler","Die Datei ist nicht vorhanden.")
    # gegebenenfalls alles beenden
    sys.exit(1)

Datei kopieren

import shutil

shutil.copy(pfadUndDateinameQuelle,pfadUndDateinameZiel)

Datei umbenennen

import os

os.rename(pfadUndDateinameQuelle,pfadUndDateinameZiel)

Datei löschen

Empfohlener Link:
https://www.w3schools.com/python/python_file_remove.asp

import os

os.remove("textdatei.txt")

Eine Datei schreiben

text = "Das ist ein Text"

pfadUndDateiname = r"\home\pi\Projekte\Python\test.txt"

try:
    fileObjektTextdatei = None
    fileobjektTextdatei = open(pfadUndDateiname, "a", encoding="utf-8")
    # a = anhängen
    # w = vorhandene Datei wird überschrieben
    # Mit encoding kann eine bestimmte Kodierung festgelegt werden, hier utf-8
    # Weitere Werte für encoding:
    # cp1252
    # latin-1 bzw. iso-8859-1
    #
    # Siehe https://docs.python.org/3/library/codecs.html
    #
    
    fileobjektTextdatei.write(text + "\n")
        
except Exception as fehler:
    print("Fehler beim Öffnen / Schreiben der Datei\n\n", fehler)
        
finally:
    if fileObjektTextdatei is None:
        print("Die gewählte Datei konnte nicht geöffnet werden.")
    else:
        if not fileObjektTextdatei.closed:
            fileObjektTextdatei.close()

Datei lesen

pfadUndDateiname = r"\home\pi\Projekte\Python\test.txt"

try:
    fileobjektDateiLesen = open(pfadUndDateiname, "r")
    #
    weitereZeile = True
    while weitereZeile:
        zeile = fileobjektDateiLesen.readline()
        if zeile == "":
            weitereZeile = False
        else:
            print(zeile)
    fileobjektDateiLesen.close()
except Exception as fehler:
        print("************\nFehler: \n\n", fehler)

Datei lesen mit besserer Fehlerbehandlung und grafischen Dialog zur Auswahl der zu öffnenden Datei

# Weitere verwendete Quellen
#
# Python GE-PACKT, 8. Auflage, Verlag mitp, von Michael Weigend, ISBN 978-3-7475-0194-8
#
# https://docs.python.org/3/library/dialog.html
# https://docs.python.org/3/library/tkinter.messagebox.html#module-tkinter.messagebox
# https://stackoverflow.com/questions/40843698/how-to-auto-activate-a-tkinter-simpledialog-pop-up-window
# https://www.geeksforgeeks.org/how-to-check-nonetype-in-python/
# https://docs.python.org/3/tutorial/errors.html
# https://docs.python.org/3/library/exceptions.html


from tkinter import filedialog
from tkinter import messagebox

# Die Datei die ausgelesen werden soll wird mit einem entsprechenden grafischen Dialog ausgewählt
pfadUndDateiname = filedialog.askopenfilename(title="Bitte eine Datei wählen")

if len(pfadUndDateiname) == 0:
    messagebox.showerror("Programmende","Keine Datei gewaehlt, das Programm wird beendet!")
else:
    try:
        fileObjekt = None
        fileObjekt = open(pfadUndDateiname,"r")
        weitereZeile = True
        while weitereZeile:
            zeile = fileObjekt.readline()
            if zeile == "":
                weitereZeile = False
            else:
                # Eingelesene Zeile ausgeben
                print(zeile)
    # Fehler abfangen
    # https://docs.python.org/3/tutorial/errors.html
    # https://docs.python.org/3/library/exceptions.html
    #
    except PermissionError:
        messagebox.showerror("Fehler","Der Zugriff auf die Datei wurde verweigert!")
    except Exception as fehlermeldung:
        messagebox.showerror("Fehler:", fehlermeldung)
    finally:
        if fileObjekt is None:
            messagebox.showinfo("Info", "Die gewählte Datei konnte nicht geöffnet werden.")
        else:
            if not fileObjekt.closed:
                fileObjekt.close()

tkinter - Einfache grafische Dialoge

Einfache Abfragen mit einem grafischen Dialog - Abfrage von Zahlen und Zeichen (Text)

# Weitere verwendete Quelle:
# https://docs.python.org/3/library/dialog.html#module-tkinter.simpledialog

from tkinter import simpledialog
from tkinter import messagebox

ganzzahl = simpledialog.askinteger("Zahl?","Bitte eine Ganzzahl eingeben:")
   
if ganzzahl is None:
    messagebox.showinfo("Abbruch","Der Eingabedialog wurde abgebrochen.")
else:
    messagebox.showinfo("Die Eingabe war:",ganzzahl)


gleitkommazahl = simpledialog.askfloat("Zahl?","Bitte eine Gleitkommazahl eingeben:")

if gleitkommazahl is None:
    messagebox.showinfo("Abbruch","Der Eingabedialog wurde abgebrochen.")
else:
    messagebox.showinfo("Die Eingabe war:",gleitkommazahl)


zeichenkette = simpledialog.askstring("Text? ABC123...","Bitte eine Zeichenkette eingeben:")

if zeichenkette is None:
    messagebox.showinfo("Abbruch","Der Eingabedialog wurde abgebrochen.")
else:
    messagebox.showinfo("Die Eingabe war:",zeichenkette)

tkinter - GUI

Ein Textfeld mit Scrollbar

Bild kann nicht geladen werden.
# https://docs.python.org/3/library/tkinter.scrolledtext.html
# https://www.geeksforgeeks.org/python/python-tkinter-scrolledtext-widget/

from tkinter import Tk
from tkinter import END
from tkinter import scrolledtext as sct

hauptfenster = Tk()

# Textfenster mit Scrollbar definieren
text_feld = sct.ScrolledText(hauptfenster, width = 80, height = 15, font = ("Courier", 15))

# Textfenster plazieren
text_feld.grid(column = 0, pady = 10, padx = 10)

# Text in Textfenster einfuegen
text_feld.insert(END, "Die erste Zeile\n")
text_feld.insert(END, "Die zweite Zeile\n")
text_feld.insert(END, "ENDE")

# Wenn alles geschrieben ist, dann das Einfuegen in das Textfeld deaktivieren.
text_feld.configure(state = 'disable')

hauptfenster.mainloop()

Ein vollständiges Programmbeispiel zum Textfeld mit Scrollbar

Programm zum Auslesen und Anzeigen einer Textdatei
Bild kann nicht geladen werden.

Hinweis:

Gerne wird um auf tkinter zuzugreifen
from tkinter import * verwendet. Das wird in dieser Dokumentation auch an der einen oder anderen Stelle gemacht, das könnte aber zu Problemen führen. In dem nachfolgenden Beispiel verwende ich durchgängig eine Alternative für den Import. Ich empfehle den nachfolgenden Link für tiefere Einblicke für den generellen Import: https://openbook.rheinwerk-verlag.de/python/20_001.html#u20.1

# Weitere verwendete Quellen

# https://docs.python.org/3/library/tkinter.scrolledtext.html
# https://www.geeksforgeeks.org/python/python-tkinter-scrolledtext-widget/

# https://tkdocs.com/shipman/button.html
# https://www.tutorialspoint.com/python/tk_button.htm
# https://www.geeksforgeeks.org/python/python-creating-a-button-in-tkinter/
# https://stackoverflow.com/questions/69734809/how-to-clear-delete-the-contents-of-a-tkinter-scrolledtext-widget

# https://stackoverflow.com/questions/33137829/how-to-replace-the-icon-in-a-tkinter-app
# https://stackoverflow.com/questions/69016178/how-to-change-icon-in-tkinter

# https://stackoverflow.com/questions/4643007/intercept-tkinter-exit-command

# https://stackoverflow.com/questions/3352918/how-to-center-a-window-on-the-screen-in-tkinter

# OS
# https://openbook.rheinwerk-verlag.de/python/31_002.html
# https://docs.python.org/3/tutorial/datastructures.html

# https://wiki.tcl-lang.org/page/winfo%28%29

# https://tkdocs.com/shipman/

import tkinter
from tkinter import scrolledtext as sct
from tkinter import filedialog
from tkinter import END
from tkinter import messagebox

import os


def ende():
    # Bei Bedarf die Groesse und die Position des Fensters ermitteln
    # um z.B. beim Start wieder einzulesen. Hier nicht realisert.
    # 
    # fensterdaten = hauptfenster.winfo_geometry()
    exit()


def dateiLaden():
    # Die Datei die ausgelesen werden soll wird mit einem entsprechenden grafischen Dialog ausgewaehlt
    pfadUndDateiname = filedialog.askopenfilename(title="Bitte eine Datei wählen")

    if len(pfadUndDateiname) == 0:
        messagebox.showerror("Programmende","Keine Datei gewaehlt, das Programm wird beendet!")
    else:
        # Den Inhalt des Textfeldes loeschen
        text_feld.delete('1.0',END)
        try:
            fileObjekt = None
            fileObjekt = open(pfadUndDateiname,"r")
            #
            tuplePfadUndDateiname = os.path.split(pfadUndDateiname)
            # Zweites Element des Tuple verwenden (die Zaehlung beginnt mit 0).
            dateiname = tuplePfadUndDateiname[1]
            # Den Dateinamen in der Titelleiste anzeigen
            hauptfenster.title("Inhalt der Datei: " + dateiname)
            #
            weitereZeile = True
            while weitereZeile:
                # Zeile auslesen
                zeile = fileObjekt.readline()
                if zeile == "":
                    weitereZeile = False
                else:
                    # Eingelesene Zeile ins Textfeld ans Ende einfuegen
                    text_feld.insert(END, zeile)
        # Fehler abfangen
        # https://docs.python.org/3/tutorial/errors.html
        # https://docs.python.org/3/library/exceptions.html
        #
        except PermissionError:
            messagebox.showerror("Fehler","Der Zugriff auf die Datei wurde verweigert!")
        except UnicodeError:
            messagebox.showerror("Fehler","Probleme beim Öffnen der Datei mit der Zeichenkodierung! \
            \nVielleicht handelt es sich nicht um eine Textdatei.")
        except Exception as fehlermeldung:
            messagebox.showerror("Fehler:", fehlermeldung)
        finally:
            if fileObjekt is None:
                messagebox.showinfo("Info", "Die gewählte Datei konnte nicht geöffnet werden.")
            else:
                if not fileObjekt.closed:
                    fileObjekt.close()
    

hauptfenster = tkinter.Tk()

# Icon in Leiste einbinden, wenn Datei fuer Icon verfuegbar ist.
#
dateinameIcon = "Lupe_32x32_hell.png"

if os.path.exists(dateinameIcon):
    # Icon in Leiste aendern
    #
    # Eine Moeglichkeit:
    #   hauptfenster.call('wm', 'iconphoto', hauptfenster._w, PhotoImage(file=dateinameIcon))
    #
    # Eine weitere Moeglichkeit:
    #
    foto = tkinter.PhotoImage(file = dateinameIcon)
    hauptfenster.wm_iconphoto(False,foto)

# Titel in Leiste festlegen
hauptfenster.title("Textdatei auslesen und anzeigen von Sherlock19@posteo.de")

# Reaktion vorsehen, wenn Fenster ueber das Kreuz beendet wird.
hauptfenster.wm_protocol("WM_DELETE_WINDOW", ende)

# Textfenster mit Scrollbar definieren und danach mit GRID plazieren
text_feld = sct.ScrolledText(hauptfenster, width = 80, height = 15, font = ("Courier", 15))
text_feld.grid(row = 0, column = 0, columnspan = 4, pady = 10, padx = 10)

# Zwei Buttons anlegen und danach mit GRID plazieren
button_datei_laden = tkinter.Button(hauptfenster, text="Datei laden", command = dateiLaden)
button_ende = tkinter.Button(hauptfenster, text="Ende", command = ende)
button_datei_laden.grid(row=1, column=0, columnspan=2, pady = 10)
button_ende.grid(row=1, column=2, columnspan=2, pady = 10)

# Fenster auf dem Bildschirm zentriert darstellen
hauptfenster.eval('tk::PlaceWindow . center')

hauptfenster.mainloop()

tkinter - Einen Ball auf einer Fläche hin und her bewegen

Bild kann nicht geladen werden.
# Ball bewegen programmiert von Sherlock19@posteo.de

# Weitere verwendete Quellen
# https://www.geeksforgeeks.org/python-after-method-in-tkinter/
# https://stackoverflow.com/questions/25753632/tkinter-how-to-use-after-method

# Notwendige Bibliotheken einbinden
from tkinter import *
import time


def ball_hin_und_her_bewegen():

    global x_schrittweite
    
    # Position des Balls ermitteln
    # geliefert wird eine Liste mit den Koordinaten x, y, x1, y1
    liste_position_ball = zeichenflaeche.coords(ball)
    x = liste_position_ball.pop(0)
    
    # Wenn der Ball zu weit nach rechts fliegt, dann die Richtung ändern
    if x > 269:
        x_schrittweite = -1
    
    # Wenn der Ball zu weit nach links fliegt, dann die Richtung ändern
    if x < 2:
        x_schrittweite = 1
        
    # Ball um einen Punkt bewegen
    zeichenflaeche.move(ball,x_schrittweite,0)

    # Warte 5 ms (Millisekunden) und rufe Prozedur auf
    zeichenflaeche.after(5,ball_hin_und_her_bewegen)


# Globale Variable zur Steuerung des Balls
x_schrittweite = 1

# Hauptfenster erzeugen
hauptfenster = Tk()

# Titel in Leiste festlegen
hauptfenster.title("Ball bewegen")

# Zeichenfläche mit einer Größe von 300 X 200 erzeugen
# (canvas = engl. für Leinwand)
zeichenflaeche = Canvas(master=hauptfenster, width=300, height=200, bg="lightgreen")

# Erzeugte Zeichenfläche auf Hauptfenster packen
zeichenflaeche.pack()

# Einen Ball auf der Zeichenfläche anlegen
ball = zeichenflaeche.create_oval(10,100,40,130, fill="yellow")


# Prozedur aufrufen um den Ball zu bewegen
# Warte 100 ms (Millisekunden)
zeichenflaeche.after(100,ball_hin_und_her_bewegen)


# Erst mit Ausführung des folgenden Befehls wird das Hauptfenster
# mit Zeichenfläche und Ball sichtbar.
hauptfenster.mainloop()

XML

XML

Empfohlene Links:
https://docs.python.org/3/library/xml.etree.elementtree.html
https://www.delftstack.com/de/howto/python/python-xml-parser/



Stand: Juni 2025