tkinter - tk.Canvas

tk.Canvas

Auf einem Canvas-Item lassen sich Items wie Linien, Rechtecke usw. anzeigen. Jedes Item verfügt dabei über eine eindeutige "Item-Id" (iid). Jede Menge an Items kann mit Tags versehen werden. Tags sind einfache Namen, die beispielsweise Gruppen von Items zugewiesen werden können. Items mit diesen Tags können als Gruppe gestylt werden und können eigene Event-Bindungen haben. Es gibt spezielle Tags: current bezeichnet das Item, über dem die Maus liegt, all sind alle Items.

tk.Canvas erzeugen

canvas = tk.Canvas(parent, Optionen)

OptionsnameBeschreibung
borderwidth, cursor, relief, takefocus, xscrollcommand und yscrollcommand Wie unter Optionen beschrieben
highlightbackground, highlightcolor, highlightthicknessEinstellungen für den Highlightrahmen
allgemeine tk-Widget-Optionen
backgroundNormale Hintergrundfarbe
insertbackgroundHintergrundfarbe Einfügecursor
insertborderwidthRahmenbreite Einfügecursor
insertofftimeEinfügecursor, Aus-Zeit (ms) beim Blinken
insertontimeEinfügecursor, Ein-Zeit (ms) beim Blinken
insertwidthBreite Einfügecursor
selectbackgroundHintergrundfarbe, wenn Elemente ausgewählt werden
selectborderwidthRahmenbreite, wenn Elemente ausgewählt werden
selectforegroundVordergrundfarbe, wenn Elemente ausgewählt werden
spezielle Canvas-Optionen
closeenoughAbstand zu einem Element, um als "im Element" zu gelten (default: 1.0)
confineTrue: Canvas View darf auch Bereiche außerhalb der Scrollregion anzeigen
height, widthHöhe und Breite des Canvas, wie sie vom LLayoutmanager angefordert werden
scrollregionRechteck: (links, oben, rechts, unten): wird als Grenze beim Scrollen des Canvas angenommen
statenormal, disabled oder hidden
xscrollincrement, yscrollincrementZahl, um die gescrollt wird

Das folgende Programm stellt ein scrollbares Canvas vor:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("500x500")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=1000, height=1000, scrollregion=(0, 0, 1000, 1000))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Horizontale Scrollbar
        scrollX = ttk.Scrollbar(self, orient=tk.HORIZONTAL, command=self.canvas.xview)
        scrollX.grid(column=0, row=1, sticky=tk.W+tk.E)

        # Vertikale Scrollbar
        scrollY = ttk.Scrollbar(self, orient=tk.VERTICAL, command=self.canvas.yview)
        scrollY.grid(row=0, column=1, sticky=tk.N+tk.S)

        # Canvas mit Scrollbar verbinden
        self.canvas.configure(xscrollcommand=scrollX.set, yscrollcommand=scrollY.set)

        # Eine Linie, damit man was sieht
        self.canvas.create_line(10, 10, 990, 990, fill='red')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Canvas-Methoden ohne Tags oder Ids

MethodeParameterRückgabewertBeschreibung
c.canvasx(screenx, gridspacing=None)Screen X-Koordinate, optionales GridspacingKoordinate relativ zum CanvasGibt die Koordinate relativ zum Canvas zurück. Ist Gridspacing gesetzt, wird zum nächten Vielfachen von Gridspacing gerundet
c.canvasy(screeny, gridspacing=None)wie c.canvasx(…)
c.cget(option)Siehe Konfigurationsmethoden
c.configure(optionen)Siehe Konfigurationsmethoden
c.image(??)Zur Zeit nicht unterstützt?
c.postscript(**kw)Keyword-Argumente: colormap, colormode, file, fontmap, height, pageanchor, pageheight, pagewidth, pagex, pagey, rotate, width, x, y-Schreibt ein Postscript-File mit dem Inhalt des Canvas
c.scan_dragto(x, y, gain=10.0), c.scan_mark(x, y)x, y-Koordinaten, gain: Faktor-Ermöglicht schnelles Scrollen über den Bildschirm mit gedrückter Maus: c.scan_dragto(…) wird mit dem MausPress-Ereignis verknüpft, c.scan_mark(…) mit dem MausMove-Ereignis. Mausbewegungen werden um den Faktor gain vergrößert.
c.xview(tk.MOVETO, fraction)fraction: 0…1 -Wird an Scrollbar command gebunden: Scrollt in horizontaler Richtung zur relativen Position fraction
c.xview(tk.SCROLL, n, what)n: Zahl, what:tk.UNITS oder tk.PAGES- Scrollt Canvas links/rechts um n what.
c.xview_moveto(fraction)Siehe c.xview(tk.MOVETO, fraction)
c.xview_scroll(n, what)Siehe c.xview(tk.SCROLL, n, units)
c.yview(tk.MOVETO, fraction)Siehe c.xview(tk.MOVETO, fraction)
c.yview(tk.SCROLL, n, what)Siehe c.xview(tk.SCROLL, n, units)
c.yview_moveto(fraction)Siehe c.xview_moveto(fraction)
c.yview_scroll(n, what)Siehe c.xview_scroll(n, units)

Canvas-Methoden, die sich auf Tags oder Ids beziehen

Innerhalb dieses Abschnitts wird von einem Textindex gesprochen. In der Regel ist damit folgendes gemeint:

Bis auf tk.INSERT können Textindices auch für Linien und Polygone benutzt werden.

MethodeParameterRückgabewertBeschreibung
c.addtag_above(newTag, tagOrId) newTag: hinzuzufügender Tag, tagOrId: ElementId oder Tag, - fügt allen Items oberhalb von tagOrId den neuen Tag newTag hinzu.
c.addtag_all(newTag) newTag: neuer Tag - fügt allen Elementen den Tag newTag hinzu
c.addtag_below(newTag, tagOrID) newTag: hinzuzufügender Tag, tagOrId: ElementId oder Tag - fügt allen Items unterhalb von tagOrId den neuen Tag newTag hinzu.
c.addtag_closest(newTag, x, y, halo=None, start=None) newTag: neuer Tag, x, y: Suchort, halo: optionaler Abstand, start: optionale ID - Fügt das Tag newTag dem Element am nächsten zu (x,y) hinzu. halo erweitert den Suchradius auf die angegebenen Pixel rund um (x, y), start sucht unterhalb dieser ID und wählt das qualifizierteste Element aus
c.addtag_enclosed(newTag, x1, y1, x2, y2) newTag: neuer Tag, (x1, y1, x2, y2) Rechteck - alle Elemente im Rechteck erhalten das Tag
c.addtag_overlapping(newTag, x1, y1, x2, y2) newTag: neuer Tag, (x1, y1, x2, y2) Rechteck - alle Elemente, die das Rechteck überlappen, erhalten das Tag
c.addtag_withtag(newTag, tagOrId) tagOrId: Elemente, newTag: neuer Tag - alle Elemente mit tagOrId erhalten das Tag newTag
c.bbox(*tagOrIds)tagOrIds: Elemente oder Tags Rechteck: (x1, y1, x2, y2) Gibt ein Rechteck (x1, y1, x2, y2) zurück, das alle Elemente umfasst, welche in *tagOrId enthalten sind. Passt keines, so wird ein leerer String zurückgegeben.
c.coords(tagOrId, x0, y0, x1, y1, …, xn, yn) tagOrId: Tag oder ElementId, x0..yn: Optionale Koordinaten Ohne Koordinaten: Gibt Koordinaten von tagOrId (dem ersten passenden Element) zurück Setzt die Koordinaten des Elementes mit der Id tagOrId auf die angegebenen Werte. Werden durch tagOrId mehrere Elemente referenziert, wird das Erste genommen. Ohne Koordinatenangabe werden die aktuellen Koordinaten ausgegeben.
c.dchars(tagOrId, first, last=first) tagOrId: Textitem, Lineitem oder Polygonitem, first: Index, last: Index, optional -entfernt Zeichen (Textitem) oder Koordinaten first bis last aus einem Item
c.delete(*tagOrIds)tagOrIds: Elemente - Entfernt und löscht die durch tagOrIds angegebenen Elemente
c.dtag(tagOrId, tagToDelete=tagOrId) tagOrId: Elemente, tagToDelete: Tag - entfernt das Tag tagToDelete von den Elementen.
c.find_above(tagOrId) tagOrId: Tag oder Element Id Liste Gibt die Id des des über tagOrId liegenden Elementes als Tupel mit einem Element zurück. Wird keines gefunden, dann wird ein leeres Tupel zurückgegeben.
c.find_all() - Liste Gibt Liste aller Ids im Canvas zurück, vom tifsten Element zum Höchsten
c.find_below(tagOrId) Siehe c.find_above(…)
c.find_closest(x, y, halo=None, start=None) Siehe c.addtag_closest(…) Findet das nächste Element, das am nächsten zu (x, y) liegt.
c.find_enclosed(x1, y1, x2, y2) Rechteck Liste es werden alle Ids zurückgegeben, die sich im Rechteck befinden
c.find_overlapping(x1, y1, x2, y2) Rechteck Liste es werden alle Ids zurückgegeben, die das Rechteck überlappen
c.find_withtag(tagOrId) tagOrId Liste es werden alle Ids zurückgegeben, die auf tagOrId passen
c.focus(tagOrId=None) tagOrId (optional), Textitem Id bewegt den Tastaturfokus auf dasjenige Element, das auf tagOrId passt. Gibt es mehrere solche Objekte, dann auf das Nächste mit Einfügemarke. Gibt es keine solchen Objekte, wird der Fokus nicht verschoben. Ist das Argument ein leerer String, dann wird der Tastaturfokus von allen Elementen entfernt. Ohne Argumente wird die Id des aktuellen Fokus-Elementes zurückgegeben
c.gettags(tagOrId) tagOrId: Element Id Liste von Tags Ist tagOrId eine Id, dann wird eine Liste von Tags dieses Elementes zurückggeben. Ist tagOrId ein Tag, dann wird diese Liste für das erste Element mit diesem Tag zurückgegeben.
c.icursor(tagOrId, index) tagOrId (Textelement), index - Setzt die Einfügemarke (Cursor) für das Textelement tagOrId auf die Stelle vor dem Zeichen mit dem Index index, der auch 'end' lauten kann. Hat keinen Effekt auf Items, die keine Einfügemarke haben.
c.imove(…)aktuell von tkinter nicht unterstützt
c.index(tagOrId, index)tagOrId, index: Textindex wie tk.INSERT (Position der Einfügemarke), tk.END (Position nach dem letzten Zeichen), tk.SEL_FIRST (Position vor Selection), tk.SEL_LAST (Position nach Selection), „@x,y“ (Position in der Näche dieser Koordinate) String mit numerischem Index Gibt die Textposition innerhalb eines Textelementes (oder des Untersten bei mehreren) als Zahl an, der sich durch den Textindex ausdrückt. Übersetzt also Textindex in Positionsangaben.
c.insert(tagOrIds, beforeThis , text)tagOrIds: Textitem(s), beforeThis : tk.INSERT (Position der Einfügemarke), tk.END (Position nach dem letzten Zeichen), tk.SEL_FIRST (Position vor Selection), tk.SEL_LAST (Position nach Selection), text: einzufügender Text - Fügt text ein, an der durch den beforeThis ausgedrückten Position. tagOrIds sind dabei Textitems
c.itemcget(tagOrId, option)tagOrId: Element oder das Tiefste von vielen, option: Itemoption Wert der option Gibt den Wert der Itemoption zurück
c.itemconfigure(tagOrId, option, …) tagOrId: Element oder das Tiefste von vielen, option (optional, Key-Value) Ohne option-Argument: dict mit aktueller Itemkonfiguration Setzt Itemoption auf der Basis von key=value. Ist der Key gesetzt, aber kein value angegben, dann gibt die Methode den Wert zum Key zurück. Gibt ohne option ein dict mit Key-Values aller Itemoptionen von tagOrId zurück.
c.move(tagOrId, dx, dy) tagOrId: Elemente, dx,dy: Pixel - Verschiebt Elemente um dx, dy
c.moveto(tagOrId, x='', y='') tagOrId: Elemente, x, y: Pixel - Legt das erste Koordinatenpaar des untersten Elements von tagOrId auf den Wert (x, y) und sorgt dafür, dass alle Elemente von tagOrId dieselbe relative Lage beibehalten
c.rchars (…)aktuell von tkinter nicht unterstützt
c.rotate (…)aktuell nicht unterstützt, kommt mit tcl/tk Version 8.7
c.scale(tagOrId, xOrigin, yOrigin, xScale, yScale) tagOrId: Elemente, xOrigin, yOrigin: Ursprung der Skalierung, xScale, yScale: 1.0 basierte Skalierungsfaktoren - Für jede Koordinate eines jeden Elementes aus tagOrId: Der Abstand der Koordinaten vom Origin wird skaliert.
c.select_adjust(tagOrId , index) tagOrId : Id eines Textelementes, index: Textindex, siehe c.insert(…) - Textauswahl wird um index erweitert und geht damit vom Ankerpunkt zum index
c.select_clear()--Alle Textauswahl wird entfernt
c.select_from(tagOrId, index) tagOrId: Id Textelement, index: Textindex, siehe c.insert(…) - Textauswahl beinhaltet einen Start- und Endwert der Auswahl wie auch einen „Anker“. Diese Funktion ändert den Anker, ändert die Textauswahl aber nicht.
c.select_item() - Objekt-ID oder None Gibt die Id des Elementes zurück, in dem es eine Textauswahl gibt
c.select_to(tagOrId, index) tagOrId: Id eines Textelementes, index: Textindex, siehe c.insert(…) - Textauswahl von Anker bis index
c.tag_bind(tagOrId, sequence=None, func=None, add=None) tagOrId: Elemente, sequence: Event (optional), function: optionale Callback, add: (optional, kann "+" oder True/False sein) - Bindet ein Ereignis an eine Callback. Ist add==True, dann wird das Event ergänzt, sonst ersetzt
c.tag_lower(tagOrId, belowThis) tagOrId:Elemente, belowThis: Element oder „unterstes“ Element bei vielen - Es werden die Elemente tagOrId unter die Elemente belowThis verschoben.
c.tag_raise(tagOrId, aboveThis) tagOrId: Elemente, aboveThis: Element oder „höchstes“ Element bei vielen - Die Elemente tagOrIdwerden oberhalb des obersten Elementes von aboveThis plaziert.
c.tag_unbind(tagOrId, sequence, funcId=None)tagOrId: Elemente, sequence: Event, funcId: optionale Callback-Entfernt die Event-Bindung
c.type(tagOrId) tagOrId: Elemente (oder das erste) 'arc', 'bitmap', 'image', 'line', 'oval', 'polygon', 'rectangle', 'text', oder 'window' Gibt den Typ des Elementes als String zurück

Im folgenden Beispiel werden einige Rechtecke erzeugt und deren Tags auf der Konsole ausgegeben. Das Item unter der Maus, also das "aktive" Item, wird jeweils besonders dargestellt (Option: activefill):

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("420x420")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight = 1)
        self.grid_rowconfigure(0, weight = 1)

        self.canvas = tk.Canvas(self, width=200, height=200,
                                scrollregion=(0, 0, 400, 400),
                                background='black')
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        r1 = self.canvas.create_rectangle(10, 10, 60, 50,
                                     fill='darkred', activefill='red',
                                     tags=('my-rect', 'rect-1'))

        r2 = self.canvas.create_rectangle(10, 50, 60, 90,
                                     fill='darkgreen', activefill='green',
                                     tags=('my-rect', 'rect-2'))

        r3 = self.canvas.create_rectangle(10, 90, 60, 130,
                                     fill='darkblue', activefill='blue',
                                     tags=('my-rect', 'rect-3'))
        # Alle Ids -> (1, 2, 3)
        print(self.canvas.find_all())
        # Einzelne Id als Tupel -> (3,)
        print(self.canvas.find_above('rect-2'))
        # -> 'rectangle'
        print(self.canvas.type(r1))

if __name__ == '__main__':
    window = A()
    window.mainloop()

Im folgenden Beispiel wird sowohl eine einzelne Id wie auch ein Tag an das MausPress-Ereignis gebunden. Das jeweils aktivierte Rechteck bekommt intern ein zusätzliches Tag namens 'current'. So lässt sich schnell herausfinden, welches Rechteck angeklickt wurde.

import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("420x420")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight = 1)
        self.grid_rowconfigure(0, weight = 1)

        self.canvas = tk.Canvas(self, width=200, height=200,
                                scrollregion=(0, 0, 400, 400),
                                background='black')
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        r1 = self.canvas.create_rectangle(10, 10, 60, 50,
                                     fill='darkred', activefill='red',
                                     tags=('my-rect', 'rect-1'))

        r2 = self.canvas.create_rectangle(10, 50, 60, 90,
                                     fill='darkgreen', activefill='green',
                                     tags=('my-rect', 'rect-2'))

        r3 = self.canvas.create_rectangle(10, 90, 60, 130,
                                     fill='darkblue', activefill='blue',
                                     tags=('my-rect', 'rect-3'))

        self.canvas.tag_bind(r1, '<Button-1>', self._onR1Press)
        self.canvas.tag_bind('my-rect', '<Button-1>', self._onRectPress)

    def _onR1Press(self, event):
        print('Rechteck 1 wurde gedrückt')

    def _onRectPress(self, event):
        print('Es wurde ein Rechteck gedrückt')
        ids = self.canvas.find_withtag('current')
        print(' id des gedrückten Rechtecks:', ids[0])
        tags = self.canvas.gettags(ids[0])
        print(' tags des gedrückten Rechtecks:', tags)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Canvas Items

Allgemeine Itemoptionen

Canvas-Items haben ebenfalls Optionen, mit denen sie erstellt werden. Hier werden allgemeine Optionen vorgestellt:

OptionsnameBeschreibung
activedashdash im Zustand tk.ACTIVE (Maus über Item)
activefillfill im Zustand tk.ACTIVE (Maus über Item)
activeoutlineoutline im Zustand tk.ACTIVE (Maus über Item)
activeoutlinestippleoutlinestipple im Zustand tk.ACTIVE (Maus über Item)
activestipplestipple im Zustand tk.ACTIVE (Maus über Item)
activewidthwidth im Zustand tk.ACTIVE (Maus über Item)
dashDash-Pattern, wird aus den Zeichen ",.-_" gebildet und ermöglicht es, besonders Ränder strichpunktiert zu zeichnen
dashoffsetOffset innerhalb von dash, wenn man nicht mit dem ersten Zeichen starten möchte
disableddashdash im Zustand tk.DISABLED
disabledfillfill im Zustand tk.DISABLED
disabledoutlineoutline im Zustand tk.DISABLED
disabledoutlinestippleoutlinestipple im Zustand tk.DISABLED
disabledstipplestipple im Zustand tk.DISABLED
disabledwidthwidth im Zustand tk.DISABLED
fillFüllfarbe oder '' (default) für transparent
offsetOffset im stipple, können auch Himmelsrichtungen und x,y-Koordinaten sein.
outlineRandfarbe, schwarz ist default
outlinestippleStipple-Bitmap der Umrandung, outline muss gesetzt sein
statetk.NORMAL: normal, tk.HIDDEN: versteckt, tk.DISABLED: keine Events möglich und ausgegraut
stippleStipple für die Innenfläche, Bitmap. '' füllt die Fläche ganz. fill muss ebenfalls gesetzt sein. Es gibt eine Reihe vordefinierter Bitmaps: (error, gray75, ,gray50 ,gray25, gray12, hourglass, info, questhead, question, warning, document, stationery, edition, application, accessory, folder, pfolder, trash, floppy, ramdisk, cdrom, preferences, querydoc, stop, note, caution )
tagsAngabe von Tags, mehrere als Tupel
widthRahmenbreite

Einige der Itemoptionen werden im folgenden Beispiel vorgestellt. Um die Auswirkung einiger Optionen zu sehen, muss man mit der Maus über die Ränder und in die Flächen fahren:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("600x400")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Rechtecke, ändern "dash" beim Überfahren mit der Maus über den Rand
        self.canvas.create_rectangle(50, 50, 150, 150, width=5, activedash='.', dash='-.-')
        self.canvas.create_rectangle(200, 50, 300, 150, width=5, activedash='-', dash='.')
        self.canvas.create_rectangle(350, 50, 450, 150, width=5, activedash=',_', dash='_')

        self.canvas.create_rectangle(50, 200, 150, 300, width=5, outline='red', fill='blue',
                                     activewidth=10, activeoutline='green', activefill='yellow')
        self.canvas.create_rectangle(200, 200, 300, 300, width=1, fill='green',
                                     stipple='gray12', activestipple='gray75')
        self.canvas.create_rectangle(350, 200, 450, 300, width=1, fill='green',
                                     stipple='gray12', activestipple='questhead')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Arc Item

Zeichnet einen Kreisbogen im Rechteck x0, y0, x1, y1

id = c.create_arc(x0, y0, x1, y1, option, …)

OptionsnameBeschreibung
extentWinkel in Grad, gemessen von start. Es wird Modulo 360 gerechnet, so dass man einen Vollkreis nicht mit 360° angeben kann.
startStartwinkel in Grad
styletk.PIESLICE -- Bogen mit Verbindung zum Mittelpunkt (default), tk.ARC -- nur der Bogen, tk.CHORD -- Bogen mit Sekante

Dazu sind die folgenden allgemeinen Itemoptionen bekannt:dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth und disabledwidth

Das folgende Programm zeigt einige Bögen mit unterschiedlichen Parametern:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("600x400")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Arcs zeichnen, erste Reihe
        self.canvas.create_arc(  0, 50, 100, 150)
        self.canvas.create_arc(150, 50, 250, 150, start=90, extent=180)
        self.canvas.create_arc(300, 50, 400, 150, start=90, extent=300)
        self.canvas.create_arc(450, 50, 550, 150, start=0, extent=359.99)
        # zweite Reihe
        self.canvas.create_arc(  0, 200, 100, 300, style=tk.PIESLICE, start=90, extent=270)
        self.canvas.create_arc(150, 200, 250, 300, style=tk.ARC, start=90, extent=270)
        self.canvas.create_arc(300, 200, 400, 300, style=tk.CHORD, start=90, extent=270)
        self.canvas.create_arc(450, 200, 550, 300, start=90, extent=270)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Bitmap Item

Stellt ein Bitmap (2-farbiges XPM) dar.

id = c.create_bitmap(x, y, optionen)

OptionsnameBeschreibung
activebackground0-Farbe im Zustand tk.ACTIVE
activebitmapdie darzustellende Bitmap im Zustand tk.ACTIVE
activeforeground Farbe für den 1-Wert im Zustand tk.ACTIVE
anchorWelcher Punkt der Bitmap soll an welche Stelle positioniert werden. Kann Himmelsrichtungen (tk.N, …) und tk.CENTER annehmen
backgroundFarbe für den 0(Null)-Wert von Bitmaps
bitmapdie darzustellende Bitmap. Hierbei kann es sich um eine vordefinierte Bitmap handelt oder um einen Dateinamen, dem man ein @ voranstellt
disabledbackground0-Farbe im Zustand tk.DISABLED
disabledbitmapdie darzustellende Bitmap im Zustand tk.DISABLED
disabledforeground Farbe für den 1-Wert im Zustand tk.DISABLED
foregroundFarbe für den 1(Eins)-Wert von Bitmaps

Dazu sind die folgenden allgemeinen Itemoptionen bekannt:state und tags

Das folgende Programm zeigt einige Bitmaps und eine Auswahl der Optionen. Es muss hierfür ein Bitmap mit dem Namen test.xbm im XBM-Format vorliegen. Das Bitmap info ist ein internes Bitmap:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("250x250")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Bitmaps darstellen
        self.canvas.create_bitmap(20, 20, bitmap="@test.xbm", anchor=tk.NW, background='red')
        self.canvas.create_bitmap(248,248, bitmap="@test.xbm", anchor=tk.SE, foreground='red')
        self.canvas.create_bitmap(20, 150, bitmap='info', activebitmap='error', activebackground='green')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Image Item

Plaziert ein mehrfarbiges Bild auf dem Canvas.

id = c.create_image(x, y, optionen)

OptionsnameBeschreibung
activeimageImage im Zustand tk.ACTIVE
disabledimageImage im Zustand tk.DISABLED
imagedarzustellendes Image

Dazu sind die folgenden allgemeinen Itemoptionen bekannt:anchor, state und tags

Das folgende Programm zeigt, wie man ein Bild lädt und es auf dem Canvas darstellt:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("400x200")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Bitmaps darstellen
        self.img = tk.PhotoImage(file='test.png')
        self.canvas.create_image(20, 20, image=self.img, anchor=tk.NW)
        ttk.Label(text='Bildherkunft: https://upload.wikimedia.org/wikipedia/commons/5/51/Static_CMOS_Inverter.png').grid()

if __name__ == '__main__':
    window = A()
    window.mainloop()

Line Item

Zeichnet eine Linie oder mehrere Linienabschnitte auf dem Canvas.

id = c.create_line(x1, y1, …, xn, yn, optionen)

OptionsnameBeschreibung
arrowtk.FIRST zeichnet eine Pfeil am Anfang, tk.LAST zeichnet einen Pfeil am Ende und tk.BOTH zeichnet an beiden Enden einen Pfeil
arrowshapeBestimmt, wie der Pfeil aussieht(u, v, w) mit u der rückwärtigen Verlängerung entlang der Linie, v: dem Auszug der Pfeilflügel nach hinten, w: der Breite des Pfeiles senkrecht zur Linie. (Siehe auch: Dimensionsangaben)
capstyleDarstellung von Linienenden: tk.BUTT: gerader Abschluss, tk.PROJECTING: wie tk.BUTT, aber länger, tk.ROUND: runde Linienenden
joinstyleDarstellung der Linienverbindung bei mehr als zwei Punkten: tk.BEVEL: abgeschrägte Verbindung, tk.MITER: spitze Verbindung, tk.ROUND: (default) abgerundete Linienverbindung
smoothBei mehr als zwei Punkten: tk.YES: Punkte werden kurvig angenähert, sonst: tk.NO
splinestepsAnzahl der Liniensegmente, die intern für die Spline herangezogen werden. Höhere Werte ergeben eine weichere Kurve. smooth muss ebenfalls gesetzt sein

Dazu sind die folgenden allgemeinen Itemoptionen bekannt:dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, stipple, activestipple, disabledstipple, state, tags, width, activewidth und disabledwidth

Das folgende Programm zeigt, wie wie sich joinstyle, smooth und splinesteps auswirken:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("450x250")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Linie darstellen mit joinstyle
        self.canvas.create_line(20, 20, 100, 20, 100, 50, width=10)
        self.canvas.create_line(20, 60, 100, 60, 100, 90, width=10, joinstyle=tk.BEVEL)
        self.canvas.create_line(20, 100, 100, 100, 100, 130, width=10, joinstyle=tk.MITER)
        self.canvas.create_line(20, 140, 100, 140, 100, 170, width=10, joinstyle=tk.ROUND)

        # Linie darstellen mit smooth
        self.canvas.create_line(120, 20, 200, 20, 200, 50, 250, 50, smooth=tk.NO)
        self.canvas.create_line(120, 60, 200, 60, 200, 90, 250, 90, smooth=tk.YES)

        # Linie darstellen mit splinesteps
        self.canvas.create_line(300, 20, 350, 20, 350, 50, 400, 50,
                                smooth=tk.YES, splinesteps=2)
        self.canvas.create_line(300, 60, 350, 60, 350, 90, 400, 90,
                                smooth=tk.YES, splinesteps=4)
        self.canvas.create_line(300, 100, 350, 100, 350, 130, 400, 130,
                                smooth=tk.YES, splinesteps=100)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Das folgende Programm zeigt, wie wie sich capstyle auswirkt:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("450x250")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Linie darstellen mit arrow
        self.canvas.create_line(20, 20, 100, 20, width=15)
        self.canvas.create_line(20, 40, 100, 40, width=15, capstyle=tk.BUTT)
        self.canvas.create_line(20, 60, 100, 60, width=15, capstyle=tk.PROJECTING)
        self.canvas.create_line(20, 80, 100, 80, width=15, capstyle=tk.ROUND)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Das folgende Programm zeigt, wie wie sich arrow und arrowshape auswirken:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("450x250")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Linie darstellen mit arrow
        self.canvas.create_line(20, 20, 100, 20, arrow=tk.FIRST)
        self.canvas.create_line(20, 120, 100, 120, arrow=tk.LAST)
        self.canvas.create_line(20, 220, 100, 220, arrow=tk.BOTH)
        # Linie mit arrowshape
        self.canvas.create_line(120, 20, 200, 20, arrow=tk.BOTH,
                                arrowshape=(10, 10, 10))
        self.canvas.create_line(120, 120, 200, 120, arrow=tk.BOTH,
                                arrowshape=(20, 10, 10))
        self.canvas.create_line(120, 220, 200, 220, arrow=tk.BOTH,
                                arrowshape=(30, 10, 10))
        self.canvas.create_line(220, 20, 300, 20, arrow=tk.BOTH,
                                arrowshape=(10, 10, 10))
        self.canvas.create_line(220, 120, 300, 120, arrow=tk.BOTH,
                                arrowshape=(10, 20, 10))
        self.canvas.create_line(220, 220, 300, 220, arrow=tk.BOTH,
                                arrowshape=(10, 30, 10))
        self.canvas.create_line(320, 20, 400, 20, arrow=tk.BOTH,
                                arrowshape=(10, 10, 10))
        self.canvas.create_line(320, 120, 400, 120, arrow=tk.BOTH,
                                arrowshape=(10, 10, 20))
        self.canvas.create_line(320, 220, 400, 220, arrow=tk.BOTH,
                                arrowshape=(10, 10, 30))

if __name__ == '__main__':
    window = A()
    window.mainloop()

Oval Item

Zeichnet ein Oval auf dem Canvas. Parameter sind ein Rechteck, in dem das Oval eingefasst wird. Dieses Item ist auch sehr gut zum Zeichnen von geschlossenen Kreisen geeignet und dafür leichter zu handhaben als Kreisbögen.

id = c.create_oval(x1, y1, x2, y2, optionen)

Es sind die folgenden allgemeinen Itemoptionen bekannt:dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth und disabledwidth

Das folgende Programm zeigt einige Ovale

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x400")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Ovale darstellen
        self.canvas.create_oval(100, 50, 200, 150, width=5, fill='red')
        self.canvas.create_oval(100, 150, 200, 350, width=5, fill='green')
        self.canvas.create_oval(20, 200, 100, 250, width=2, fill='blue')
        self.canvas.create_oval(200, 200, 280, 250, width=2, fill='blue')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Polygon Item

Zeichnet ein geschlossenes Polygon. Es wird vom letzten zum ersten Punkt automatisch zurückgezeichnet.

id = c.create_polygon(x1, y1, …, xn, yn, optionen)

OptionsnameBeschreibung
joinstyleSiehe hierzu LineItem
smoothSiehe hierzu LineItem
splinesteps Siehe hierzu LineItem

Es sind die folgenden allgemeinen Itemoptionen bekannt:dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth und disabledwidth

Das folgende Programm zeigt Polygone:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x200")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Polygone darstellen
        self.canvas.create_polygon(20, 20, 100, 100, 20, 100, width=5, fill='red')
        self.canvas.create_polygon(200, 20, 250, 50, 200, 120, 150, 50, width=5, fill='green')

if __name__ == '__main__':
    window = A()
    window.mainloop()

Rectangle Item

Zeichnet ein Rechteck

id = c.create_rectangle(x1, y1, x2, y2, optionen)

Es sind die folgenden allgemeinen Itemoptionen bekannt: dash, activedash, disableddash, dashoffset, fill, activefill, disabledfill, offset, outline, activeoutline, disabledoutline, outlinestipple, activeoutlinestipple, disabledoutlinestipple, stipple, activestipple, disabledstipple, state, tags, width, activewidth und disabledwidth

Für Beispiele siehe das Beispiel zu Canvas-Methoden, die sich auf Tags oder Ids beziehen

Text Item

Zeichnet einen Text auf dem Canvas

id = c.create_text(x, y, optionen)

OptionsnameBeschreibung
anchorPositioniert Textitem relativ zum Inhalt, mögliche Werte sind Himmelsrichtungen (tk.N…) und tk.CENTER
fontDer Font, siehe Font
justifyAusrichtung bei mehrzeiligem Text: tk.LEFT, tk.RIGHT oder tk.CENTER
textdarzustellender Text
width maximale Zeilenlänge, längere Zeilen werden beim NewLine oder Space umgebrochen. (Siehe auch: Dimensionsangaben

Es sind die folgenden allgemeinen Itemoptionen bekannt: fill, activefill, disabledfill, stipple, activestipple, disabledstipple, state und tags

Das folgende Programm zeichnet Text auf dem Canvas:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x200")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Text darstellen
        self.canvas.create_text(10, 10, text='Hallo Welt', anchor=tk.NW)
        self.canvas.create_text(10, 50, text='Dieses ist ein sehr langer'
                                + 'Text mit sicher mehr als einer '
                                + 'einzelnen Zeile.',
                                width=100,
                                justify=tk.RIGHT,
                                anchor=tk.NW)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Window Item

Stellt ein tk- oder ttk-Widget auf dem Canvas dar. Diese Widgets liegen immer über anderen grafischen Objekten.

id = c.create_window(x, y, optionen)

OptionsnameBeschreibung
anchorPositioniert Widgets relativ zum Inhalt, mögliche Werte sind Himmelsrichtungen (tk.N…) und tk.CENTER
height Höhe des Widgets, (Siehe auch: Dimensionsangaben)
width Breite des Widgets, (Siehe auch: Dimensionsangaben)
windowdarzustellendes Widget. Dieses muss Kind-Widget vom Canvas oder dem parent-Element von Canvas sein.

Es sind die folgenden allgemeinen Itemoptionen bekannt: state und tags

Das folgende Programm stellt ein ttk.Button im Canvas dar:

Bild der Anwendung
import tkinter as tk
from tkinter import ttk

class A(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry("300x200")
        self._createWidgets()

    def _createWidgets(self):
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        # Canvas erzeugen
        self.canvas = tk.Canvas(self, width=400, height=400, scrollregion=(0, 0, 400, 400))
        self.canvas.grid(column=0, row=0, sticky=tk.N+tk.S+tk.W+tk.E)

        # Window erzeugen
        w =  ttk.Button(self.canvas, text='Ein Knopf')

        # Window darstellen
        self.canvas.create_window(100, 100, window=w)

if __name__ == '__main__':
    window = A()
    window.mainloop()

Referenzen

Siehe Auch