Python Tkinter | ☎️ Telefonbuch Tutorial (Deutsch)

Hallo zurück. Heute schreiben wir ein kleines Python-Telefonbuch.

Zuerst importieren wir uns wie immer die benötigten Module. Wir nutzen heute tkinter.

import tkinter as tk

Unser Telefonbuch besteht aus zwei Listen, die wir später an unterschiedlichen Stellen im Programm anzeigen. Einer Liste enthält alle Namen und eine Liste enthält alle Nummern.

contact_names = list()
contact_numbers = list()

Die Listen füllen wir dann natürlich nicht von Hand mit Daten, sondern Python soll für uns die Daten aus einer Datei auslesen. Deshalb erzeuge ich eine neue Text-Datei. Die nenne ich contacts.txt und hinterlege in ihr meine Kontakte.

Oma Hans, 8482890
Elfride, 01473-3424021
Dieter Bohlen, +43 676 38140354

Python soll jetzt diese Datei öffnen, die Daten auslesen und für uns in die Listen hinterlegen.

def read_contacts_from_file():
    with open ('contacts.txt','r') as f:
        contact_strings = f.readlines()

    for contact in contact_strings:
        contact = contact.rstrip('\n')
        contact = contact.split(', ')

        contact_names.append(contact[0])
        contact_numbers.append(contact[1])


read_contacts_from_file()

Jetzt wird es Zeit, unser Fenster zu erstellen.

window = tk.Tk()
window.title('Mein Telefonbuch')
window.geometry('300x300')
window.config(bg="lightblue")

numbers_label = tk.Label(text='Hallo!')
numbers_label.config(font=("Arial", 20, "bold"), bg="lightblue")

# This is where the contact_names_var will be added later

numbers_label.pack(pady=10)
contact_listbox.pack()

window.mainloop()

Wir wollen alle Kontakte aus unserer Liste später in einer Listbox anzeigen. Blöderweise kann Tkinter Listen nicht direkt lesen. Aber es gibt es ein Tkinter Objekt, dass uns diese Möglichkeit eröffnet, und zwar das StringVar-Objekt. Damit wandeln wir eine Liste so um, dass sie für Tkinter lesbar ist.

contact_names_var = tk.StringVar(value=contact_names)
contact_listbox = tk.Listbox(window, height=10, listvariable=contact_names_var)

Das funktioniert jetzt schon ganz gut, allerdings ist unser Telefonbuch noch nicht interaktiv. Und darum kümmern wir uns jetzt. Wir sorgen jetzt dafür, dass Python darauf wartet, dass ein Kontakt ausgewählt wird. Und wenn ein Kontakt gewählt wurde, wird die entsprechende Telefonnummer angezeigt. Und dafür binden wir eine Funktion an die Listbox, die genau das macht.

contact_listbox.bind('<<ListboxSelect>>', lambda e: display_number_for_contact())

Die Funktion display_number_for_contact schreiben wir jetzt.

def display_number_for_contact():
    i = contact_listbox.curselection()[0]
    number = contact_numbers[i]
    numbers_label['text'] = number

Als erstes lesen wir den Index aus, also welche Zeile der Listbox gerade ausgewählt ist. Dann gehen wir in die Nummernliste und ziehen uns die Nummer heraus, die den ausgewählten Index hat. Also wenn der Nutzer z.B. Zeile 3 auswählt, wird die dritte Nummer herausgesucht. Und abschließend lassen wir uns die Nummer auf dem Nummernlabel anzeigen.

Und damit haben wir es auch schon geschafft.

✅ Kompletter Quellcode

import tkinter as tk

contact_names = list()
contact_numbers = list()


def read_contacts_from_file():
    with open ('contacts.txt','r') as f:
        contact_strings = f.readlines()

    for contact in contact_strings:
        contact = contact.rstrip('\n')
        contact = contact.split(', ')

        contact_names.append(contact[0])
        contact_numbers.append(contact[1])


# Before the window is created, we initially load all contacts from file.
read_contacts_from_file()


def display_number_for_contact():
    i = contact_listbox.curselection()[0]
    number = contact_numbers[i]
    numbers_label['text'] = number


window = tk.Tk()
window.title('Mein Telefonbuch')
window.geometry('300x300')
window.config(bg="lightblue")

numbers_label = tk.Label(text='Hallo!')
numbers_label.config(font=("Arial", 20, "bold"), bg="lightblue")

contact_names_var = tk.StringVar(value=contact_names)
contact_listbox = tk.Listbox(window, height=10, listvariable=contact_names_var)
contact_listbox.bind('<<ListboxSelect>>', lambda e: display_number_for_contact())

numbers_label.pack(pady=10)
contact_listbox.pack()

window.mainloop()