Polygone / Hexfeld / Sechseck

Fragen zu Tkinter.
Antworten
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Hallo,

ich möchte einen ganzen Haufen Polygone mit den Koordinaten
x1,y1 ... x6,y6 zeichnen.

Wie bekomme ich ein exakt gleichschenkliges hin,
und wie könnte man eine Funktion schreiben, die nach dem
ersten zeichnen des ersten Hexfeld anschließend die Werte / Koordinaten
so verändert, dass an eine Ecke x des Ersten, ein Zweites gezeichnet wird.

Meine Gedanken waren wie folgt :

Code: Alles auswählen

from Tkinter import *
def spielbrett () :
    master = Tk()
    spiel = Canvas(master, width=900, height=600)
    spiel.pack()
    polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green")
    master.mainloop()
        
spielbrett(100,100,130,100,145,126,130,152,100,152,85,126)
spielbrett(145,126,175,126,190,152,175,178,145,178,130,152)
Allerdings erstellt Python beim zweiten Aufruf der Funktion ein zweites Canvas Fenster und zeichnet nicht im ersten Fenster ein zweites polygon.

Habt Ihr ne Idee ?

Gruß
Kai

Edit (BlackJack): Quelltext in Code-Tags gesetzt.
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

wie bekommt ihr das immer hin, dass der Code hier eingerückt
erscheint ? ich kopiere das immer aus IDLE und nach dem import
ist die Einrückung verschwunden ???
imac
20 Zoll
2,4 ghz
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du musst dafür bbcode nehmen. Das heisst du schreibst den Code dafür in diese Klammern.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

derkai hat geschrieben:Allerdings erstellt Python beim zweiten Aufruf der Funktion ein zweites Canvas Fenster und zeichnet nicht im ersten Fenster ein zweites polygon.
Naja, das ist ja klar. Bei jedem Funktionsaufruf erzeugst du eine neue Instanz der Canvas. Diese Erzeugung - und auch die von Tk()! - gehören nicht in die Funktion!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

derkai hat geschrieben:Wie bekomme ich ein exakt gleichschenkliges hin,
und wie könnte man eine Funktion schreiben, die nach dem
ersten zeichnen des ersten Hexfeld anschließend die Werte / Koordinaten
so verändert, dass an eine Ecke x des Ersten, ein Zweites gezeichnet wird.
Das wird ganz ohne Mathematik nicht gehen. Dazu müsstest du dir ein paar Gedanken machen über die Winkel in einem gleichschenkligen Sechseck.

Und wenn du es mit "Tkinter pur" machen willst, dann brauchst du auch die Trigonometrie. Alternativ könntest du ein Modul verwenden, das mit relativen Zeichenoperationen arbeitet. Ich kenne derer drei, die auf Tkinter aufsetzen:

turtle: Gehört zu Tkinter dazu, macht aber keinen Spaß.

xturtle: Gibt es hier http://xturtle.rg16.at/ und macht Spaß.

frog: Gibt es hier http://pypi.python.org/pypi/frog/0.75 und macht noch mehr Spaß.

Mit dem frog Modul lässt sich ein regelmäßiges Sechseck z.B. so zeichnen:

Code: Alles auswählen

from frog import *
pool = Pool()
frog = Frog(pool, visible=False)
for k in range(6):
        frog.move(50)
        frog.turn(60)
pool.ready()
Das ist ein komplett lauffähiges Programm. Du kannst einen Pool auch in eine Tkinter-GUI integrieren - einfach an Stelle eines Canvas-Widgets verwenden.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

ok, aber warum klappt das hier dann nicht ?

from Tkinter import *
x1 = 100, y1 = 100,
x2 = 130, y2 = 100,
x3 = 145, y3 = 126,
x4 = 130, y4 = 152,
x5 = 100, y5 = 152,
x6 = 85, y6 = 126

master = Tk()
spiel = Canvas(master, width=900, height=600)
spiel.pack()

polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green")
master.mainloop()

Warum kann ich die Werte x1 ... denn nicht mit einem Wert vorbelegen ?
imac
20 Zoll
2,4 ghz
BlackJack

Weil das so keine gültige Python-Syntax ist. Wo hast Du die Idee her, dass man da Kommata verwenden könnte?

Allerdings sollte man sich bei durchnummerierten Namen sowieso überlegen, ob eine Liste nicht sinnvoller wäre.

Wobei die Koordinaten als Werte vorgeben keine gute Idee ist. Du willst ja später ein ganzes Feld davon Zeichnen, da wäre es besser eine Funktion zu schreiben, die einen Mittelpunkt und einen Radius bekommt und um diesen Punkt ein Sechseck zeichnet.

IMHO fängst Du am falschen Ende an. Bevor Du Dich mit der Anzeige herum schlägst, solltest Du Dir Gedanken darüber machen, wie Du das Spielfeld in der Spiellogik repräsentierst.
Antworten