Ein in Webseiten eingebetteter Link ist ein Hyperlink, wobei in der Regel nur die
Kurzform als Bezeichnung verwendet wird. Eine kleine Ungenauigkeit bleibt bei Verwendung der Kurzform
erhalten, denn ein Link ist in anderen Bereichen ein verbindendes Glied. Fehlt dieses, so wird bereits ab den
1850er Jahren die Bezeichnung Missing Link verwendet. Ein Weblink gibt hingegen die Adresse eines Sprungzieles
in einem Dokument an, oder verweist auf eine andere Adresse im Web.
Kleine Vorbemerkung, in den Code-Beispielen auf dieser Seite haben wir es bei dem Bezeichner "Fenster"
belassen, da ein Widget vom Prinzip auch nichts weiter als eine kleine App bzw. eine Mini-Fensteranwendung
ist und wie groß oder umfangreich eine Anwendung wird, darüber entscheidet letztendlich nur der Entwickler.
Wichtiger als diese eher nebensächlichen Vorbemerkungen ist hingegen zu wissen, dass jede Tastatureingabe und
jeder Mausklick einem Event (Ereignis) entspricht. Ein Betriebssystem eines Rechners sieht nicht, ob
sich ein Mauszeiger über einen Link oder einen Button befindet, wenn ein Nutzer einen Mausklick ausführt, doch
es kann dieses Ereignis des Klickens einer geöffneten Anwendung mitteilen, einschließlich der Maus-Koordinaten
zum Zeitpunkt des Klicks. Die Anwendung stellt dann fest, bei welchem Element sich dieses Event ereignete.
Ein Programmierer braucht nun lediglich der Anwendung noch beizubringen, welche Folgen dieses Event bei diesem
oder jenem Element nach sich ziehen sollte. Tkinter stellt für die Bindung von Events die Bind-Methode zur
Verfügung.
Aufbau der Bind-Methode, wie sie in der Klasse Misc unter Lib/tkinter/__init__.py definiert ist:
def bind(self, sequence=None, func=None, add=None):
An dieser Methode wird als Wert für "sequence" das Argument "<Button-1>"
übergeben, welches als Modifier dient, um zwischen den Events oder deren Quellen unterscheiden zu können.
Im Beispiel, um Linksklicks von der Maus zu erfassen, wobei zusätzlich an "func" der Bezeichner für die
aufzurufende Callback-Funktion übergeben wird. Diese Funktion wiederum ruft die Funktion webbrowser.open_new
auf, welche die angegebene URL in einem neuen Fenster des Standardbrowsers öffnet.
Weitere Modifier wären z.B. "<Button-1>", "<Button-2>" und "<Button-3>" für die linke,
mittlere und rechte Maustaste.
Code und Ansicht des ersten Testfensters:
from tkinter import Tk, Label import webbrowser fenster=Tk() fenster.title("Fenster mit Hyperlink") fenster.wm_iconbitmap("images/logo.ico") fenster.geometry("360x160") fenster["bg"] = "#f8f6e4" def callback(event): webbrowser.open_new(r"https://www.example.com") Label(fenster, text="\nFenster mit Hyperlink", font = ("cambria", 13), bg = "#f8f6e4" ).pack() # Klick-Events an die callback Funktion per Event-Händler binden. link = Label(fenster, text="\n» Klick mich! «\n", font = ("cambria", 12, "bold"), fg = "#246484", bg = "#f8f6e4", cursor = "hand2" ) link.pack() link.bind("<Button-1>", callback) if __name__ == "__main__": fenster.mainloop()
Bild 1: Ansicht der ersten Desktop-App mit einem einfachen Textlink.
Nur der Vollständigkeit zur Liebe sei erwähnt, dass sich die Bind-Methode nicht nur in Verbindung mit Labels anwenden ließe, sondern z.B. ebenso bei Buttons. Allerdings ist der nachfolgende Code nicht unbedingt empfehlenswert.
Code und Ansicht des zweiten Testfensters:
from tkinter import Tk, Label, Button import webbrowser fenster=Tk() fenster.title("Widget mit Hyperlinks") fenster.wm_iconbitmap("images/logo.ico") fenster.geometry("360x180") fenster["bg"] = "#f8f6e4" def lade_example_com(event): webbrowser.open_new(r"https://www.example.com") def lade_example_net(event): webbrowser.open_new(r"https://www.example.net") Label(fenster, text="\nWidget mit Hyperlinks\n", font = ("cambria", 13), bg = "#f8f6e4" ).pack() # Klick-Events an die callback Funktionen per Event-Händler binden. link_com = Button(fenster, text=" » example.com « ", font = ("cambria", 12, "bold"), fg = "#cfcfcf", bg = "#585858", bd = 3, width = 18, cursor = "hand2") link_com.pack(pady = 6) link_com.bind("<Button-1>", lade_example_com) link_net = Button(fenster, text=" » example.net « ", font = ("cambria", 12, "bold"), fg = "#cfcfcf", bg = "#585858", bd = 3, width = 18, cursor = "hand2") link_net.bind("<Button-1>", lade_example_net) link_net.pack(pady = 6) if __name__ == "__main__": fenster.mainloop()
Bild 2: Ansicht des Widgets (Testfensters) mit Buttons für Weblinks.
Wesentlich besser, im Vergleich zum letzten Code-Beispiel, sieht es mit dem Code des nächsten Beispiels aus. Bei Buttons lässt sich die Option "command" verwenden und mit dieser eine Funktion oder Methode aufrufen. Wird zusätzlich noch vom Modul "functools" die Klasse "partial" importiert, können auch die Webadressen mit übergeben werden.
Code des dritten Testfensters (Ansicht wie Bild 2):
from tkinter import Tk, Label, Button from functools import partial import webbrowser fenster=Tk() fenster.title("Widget mit Hyperlinks") fenster.wm_iconbitmap("images/logo.ico") fenster.geometry("360x180") fenster["bg"] = "#f8f6e4" def lade_example_url(url): webbrowser.open_new(r"{}".format(url)) Label(fenster, text="\nWidget mit Hyperlinks\n", font = ("cambria", 13), bg = "#f8f6e4" ).pack() # Bei Klick-Events die URL an die aufzurufende Funktion übergeben. Button(fenster, text=" » example.com « ", font = ("cambria", 12, "bold"), fg = "#cfcfcf", bg = "#585858", bd = 3, width = 18, cursor = "hand2", command = partial(lade_example_url, "https://www.example.com") ).pack(pady = 6) Button(fenster, text=" » example.net « ", font = ("cambria", 12, "bold"), fg = "#cfcfcf", bg = "#585858", bd = 3, width = 18, cursor = "hand2", command = partial(lade_example_url, "https://www.example.net") ).pack(pady = 6) if __name__ == "__main__": fenster.mainloop()
Falls mehr als zwei Links in einer Anwendung aufgenommen und in einem Menü oder einer Liste ausgegeben werden sollen, so ist es nicht erforderlich, diese als Buttons alle einzeln untereinander zu notieren. Der Code würde kürzer und übersichtlicher, würden die Beschriftungen und Webadressen jeweils in Tuples aufgenommen werden. Die Ausgabe der Buttons, sowie die Zuordnung der Button-Beschriftungen und Webadressen könnte dann, wie im vierten Beispiel, durch eine einfache Zählschleife erfolgen.
Code und Ansicht des vierten Testfensters:
from tkinter import Tk, Label, Button from functools import partial import webbrowser fenster=Tk() fenster.title("Widget mit Hyperlinks") fenster.wm_iconbitmap("images/logo.ico") fenster.geometry("360x240") fenster["bg"] = "#f8f6e4" def lade_example_url(url): webbrowser.open_new(r"{}".format(url)) Label(fenster, text="\nWidget mit Hyperlinks\n", font = ("cambria", 13), bg = "#f8f6e4" ).pack() # Bei Klick-Events die URL an die aufzurufende Funktion übergeben. button_text = ("example.com", "example.org", "example.net") button_urls = ("https://www.example.com", "https://www.example.org", "https://www.example.net") for i in range(3): Button(fenster, text=" » {} « ".format(button_text[i]), font = ("cambria", 12, "bold"), fg = "#cfcfcf", bg = "#585858", bd = 3, width = 18, cursor = "hand2", command = partial(lade_example_url, "{}".format(button_urls[i])) ).pack(pady = 6) if __name__ == "__main__": fenster.mainloop()
Bild 3: Ansicht des Widgets (Testfensters) mit Buttonliste für Weblinks.
Die Beispiele auf dieser Seite wurden mit der Python Version 3.7.4 und der Tkinter Version 8.6 getestet.
Einstieg in Python
OOP mit Python
Codes & Tutorials
Kleines Projekt