stern im tkinter code?
Hallo,
ich soll eine Flagge mit Python und tkinter machen, ich wollte gern die Chile Flagge machen. Die Grundlage habe ich, jetzt fehlt nur noch der Stern. Im Internet hab ich also versucht einen Code zu finden, dieser funktioniert jedoch nicht und folgende Fehlermeldung taucht auf:
%Run Flagge_Chile.py
Traceback (most recent call last):
File "F:\WI\01_Python OOP WI\01_Objekte und Klassen\L1_1_Aufgabe_Flagge_HA_Chile.py", line 141, in <module>
s.zeichnen()
File "F:\WI\01_Python OOP WI\01_Objekte und Klassen\L1_1_Aufgabe_Flagge_HA_Chile.py", line 83, in zeichnen
canvas.create_line(self.pos_x0, self.pos_y0, self.pos_x1, self.pos_y1, self.pos_x2, self.pos_y2, self.pos_x3, self.pos_y3, self.pos_x4, self.pos_y4, fill=self.farbe, outline=self.farbe)
File "F:\S20\Programme\Thonny_3.2.3\lib\tkinter\__init__.py", line 2492, in create_line
return self._create('line', args, kw)
File "F:\S20\Programme\Thonny_3.2.3\lib\tkinter\__init__.py", line 2480, in _create
*(args + self._options(cnf, kw))))
_tkinter.TclError: unknown option "-outline"
Das ist der Programmcode:
import tkinter as tk
class Rechteck:
# Initialisiert ein Rechteck Objekt mit Standardwerten
def __init__(self):
self.breite = 0
self.hoehe = 0
self.pos_x = 0
self.pos_y = 0
self.farbe = "black"
def __str__(self):
return "Dies ist die Klasse 'Rechteck'"
# Malt auf ein übergebenes "tk.Canvas" Objekt das Rechteck
def zeichnen(self):
x_ende = self.pos_x + self.breite
y_ende = self.pos_y + self.hoehe
canvas.create_rectangle(self.pos_x, self.pos_y, x_ende, y_ende, fill=self.farbe, outline=self.farbe)
class Kreis:
def __init__(self):
self.pos_x = 0
self.pos_y = 0
self.radius = 0
self.farbe = "black"
def __str__(self):
return "Dies ist die Klasse 'Kreis'"
# Malt auf ein übergebenes "tk.Canvas" Objekt den Kreis
def zeichnen(self):
# berechne Postion bis wohin gezeichnet werden muss, abhängig vom Radius
x_beginn = self.pos_x - self.radius
y_beginn = self.pos_y - self.radius
x_ende = self.pos_x + self.radius
y_ende = self.pos_y + self.radius
canvas.create_oval(x_beginn, y_beginn, x_ende, y_ende, fill=self.farbe, outline=self.farbe)
class Stern:
def __init__(self):
self.pos_x0 = 0
self.pos_y0 = 0
self.pos_x1 = 0
self.pos_y1 = 0
self.pos_x2 = 0
self.pos_y2 = 0
self.pos_x3 = 0
self.pos_y3 = 0
self.pos_x4 = 0
self.pos_y4 = 0
self.farbe = "black"
self.outline = "black"
def __str__(self):
return "Dies ist die Klasse 'Stern'"
def zeichnen(self):
canvas.create_line(self.pos_x0, self.pos_y0, self.pos_x1, self.pos_y1, self.pos_x2, self.pos_y2, self.pos_x3, self.pos_y3, self.pos_x4, self.pos_y4, fill=self.farbe, outline=self.farbe)
if __name__ == '__main__':
# GUI Klasse initialisieren
application = tk.Tk()
# Hinzufügen einer Zeichenfläche
canvas = tk.Canvas(application, width=600, height=400)
canvas.pack()
r = Rechteck()
r.pos_x = 30
r.pos_y = 30
r.breite = 200
r.hoehe = 200
r.farbe = "blue"
r.zeichnen()
r.pos_x = 230
r.pos_y = 30
r.breite = 390
r.hoehe = 200
r.farbe = "white"
r.zeichnen()
r.pos_x = 30
r.pos_y = 230
r.breite = 600
r.hoehe = 220
r.farbe = "red"
r.zeichnen()
s = Stern()
s.pos_x0 = 40
s.pos_y0 = 70
s.pos_x1 = 60
s.pos_y1 = 40
s.pos_x2 = 80
s.pos_y2 = 70
s.pos_x3 = 40
s.pos_y3 = 50
s.pos_x4 = 80
s.pos_y4 = 70
s.outline = "red"
s.zeichnen()
# Fokus auf die GUI legen und starten
tk.mainloop()
Weiß jemand wo der Fehler ist und könnte mir helfen?
Im Voraus schonmal Dankeschön.
2 Antworten
_tkinter.TclError: unknown option "-outline"
Die Funktion "create_line" hat den Parameter "outline" nicht (in der "zeichnen" Funktion von "Stern"). Es sieht danach aus, dass line üblicherweise nicht gefüllt ist (fill also die Farbe der outline ist): https://www.tcl.tk/man/tcl8.7/TkCmd/canvas.html#M146
Versuchs doch mal mit "create_polygon", aber beachte, dass beim Füllen die "Even-Odd" Regel gilt: https://en.wikipedia.org/wiki/Even%E2%80%93odd_rule (besser Illustiert hier: https://www.w3.org/TR/SVG/painting.html#WindingRule)
das Problem entsteht, weil die Methode create_line kein outline-Argument unterstützt. Um einen Stern korrekt zu zeichnen, solltest du stattdessen die Methode create_polygon verwenden, die sowohl fill als auch outline akzeptiert.