Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

Tkinter: Fenster-Apps oder Widgets mit Links bzw. Hyperlinks

Kleine Apps mit Weblinks erstellen

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 ver­bindendes Glied. Fehlt dieses, so wird bereits ab den 1850er Jahren die Bezeich­nung 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 umfang­reich 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, ein­schließ­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>" über­geben, welches als Modifier dient, um zwischen den Events oder deren Quellen unter­scheiden 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()
    

Desktop-App mit Textlink
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. Aller­dings 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()

Widget-App mit Links
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" ver­wenden 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()

Widget-App mit Buttonliste für Links
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.

 
Navigation

Einstieg in Python

 


OOP mit Python

 


Codes & Tutorials

 

Weitere Themen

Kleines Projekt

 


Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen