Tkinter

Ralf Muschall

Überblick

Inhalt

Widget-Sets

Tk/Gtk/Qt

Tk
alt, einfach, einfach in alles einbindbar
Gtk
GPL, C, einfach in alle Sprachen einbindbar
Qt
z.T. GPL(?), C++, Einbindung schwerer ⇒ nur in verbreitetste Sprachen eingebunden, z.B. nicht in Ocaml, soll leichter programmierbar sein als Gtk
wx
Kenne ich nicht ☺

Hello World

import Tkinter,sys

class Hello(object):
    def __init__(self,parent):
        '''
        Hello Button
        '''
        self.b=Tkinter.Button(parent,
                              command=sys.exit,
                              text='Hello world')
        self.b.pack()

if __name__=='__main__':
    root=Tkinter.Tk()
    h=Hello(root)
    root.mainloop()

Erläuterung zu "Hello World"

b=Tkinter.Button(args): erzeuge Objekt
b.pack(): mache Objekt sichtbar (nur, falls parent schon sichtbar ist)
root=Tkinter.Tk(): erzeuge sichtbares Toplevel-Window
root.mainloop(): Starte Tk-Eventloop

Widgets Teil 1

Einfachste Widgets

Frame
Flächenaufteilung
Label
passive Text- oder Bildflächen
Button
Entry
einzeilige Texteingabe
Radiobutton
Auswahl 1 aus n
Checkbutton
0...n aus n

Widgets Teil 2

Mehr einfache Widgets

Scale
Einstellen eines Gleitkommawertes
Scrollbar
Steuerung von Canvas oder Listbox (und nur diese!), kompliziert. Erlaubt indirekt Scrollen von allem durch Einbetten anderer Widgets ins Canvas
Text
Editierfeld
Tk
Erstes Toplevel
Toplevel
Weitere Toplevel

Widgets Teil 3

kompliziertere Widgets

Canvas
Vektorgraphik, scrollfähig, kann andere Widgets enthalten
Menu
Drop-Down-Menü
Listbox
Anzeigen vieler Textzeilen, scrollfähig
Menubutton
"Kopf" eines Menüs (Menü selbst wird als Constructorargument übergeben, muss schon existieren)

Widget Constructor Parameters

Nur sinngemäß anwendbar

(erstes Argument)
parent, d.h. normalerweise umgebendes Widget
command
Aktion bei Linksclick und Loslassen
text
Anzeigetext (vom Programm vorgegeben, zur Laufzeit mit configure änderbar)
color, background, width, height
selbsterklärend

Geometrie-Manager 1

pack 1

side=Tkinter.LEFT
Reserviere Gebiet für neues Widget möglichst weit links im Parent
fill=Tkinter.X
Widget soll das für es reservierte Gebiet ausfüllen
Das heißt nicht, dass das Parent mehr ausgefüllt wird, sondern nur, dass das Widget sich auf allen ungenutzten Platz im reservierten Gebiet ausdehnt

Geometrie-Manager 2

pack 2

expand=True
Reserviertes Gebiet wird (bei mehreren gerecht) maximiert, Widget wird nicht größer (falls nicht fill gesetzt wurde)
padx, pady
External padding: Mache reserviertes Gebiet um angegebene Größe größer als benötigt
ipadx, ipady
Internal padding: Mache reserviertes Gebiet um angegebene Größe größer als benötigt und vergrößere Widget um denselben Betrag
anchor
Position im reservierten Gebiet

Geometrie-Manager 3

grid 1

column=Zahl
Welche Spalte
row=Zahl
Welche Zeile
Nur belegte Spalten und Zeilen existieren

Geometrie-Manager 4

grid 2

Eigene "Widgets"

Zusammengesetzt aus mehreren

class LabeledEntry:
    def __init__(self, parent, ...)
        self.l=Tkinter.Label(parent, ...)
        self.e=Tkinter.Entry(parent, ...)
        self.l.pack(side=Tkinter.LEFT)
        self.e.pack(side=Tkinter.LEFT)

Vorausgesetzt, dass parent geeignet ist (z.B. Frame, jemand kümmert sich um pack())

Canvas-Items

Vektorgraphik

c=Tkinter.Canvas(...)
c.create_arc(xmin=100,ymin=200,xmax=150,ymax=250,...)

Andere Widgets

f=Tkinter.Frame(c)
Zweck: f wird mit den eventuell an c befestigten Scrollbars mitgescrollt.

Literatur