verdammt, ich kapier es einfach nicht

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

Samstag 5. Juli 2008, 00:27

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

for i in range (3) :
x1 = x1 + 30
x2 = x2 + 30
x3 = x3 + 30
x4 = x4 + 30
x5 = x5 + 30
x6 = x6 + 30
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()

Mir ist klar, dass bei jedem Schleifenduchlauf, eine neue Instanz
Tk gebildet wird und bei jedem der drei Schleifendurchgänge ein neues Polygon in einem neuen Fenster geöffnet wird.

ABER wie sähe denn der Code richtig aus, wenn
alle drei in gleichem Fenster gezeichnet werden sollen ?

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
~Mitneid~
User
Beiträge: 5
Registriert: Samstag 5. Juli 2008, 04:59

Samstag 5. Juli 2008, 05:06

Morgen!

Code: Alles auswählen

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()
for i in range (3) : 
    x1 = x1 + 30 
    x2 = x2 + 30 
    x3 = x3 + 30 
    x4 = x4 + 30 
    x5 = x5 + 30 
    x6 = x6 + 30 
    polygone = spiel.create_polygon(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,outline="black",fill="green") 
master.mainloop() 
Nimm Tk einfach aus der Schleife raus... ..dann gibt es auch keine neuen Fenster :D
Benutzeravatar
~Mitneid~
User
Beiträge: 5
Registriert: Samstag 5. Juli 2008, 04:59

Samstag 5. Juli 2008, 05:38

War schon halb eingeschlafen...
hab dann doch noch schnell was gebastelt.. geht bestimmt noch auf anderen Wegen.. wie gesagt Schlafmangel :oops:

Code: Alles auswählen

from Tkinter import *

x=[100,130,145,130,100,85]
y=[100,100,126,152,152,126]
master = Tk()
farbe="green"
spiel = Canvas(master, width=900, height=600,bg="blue")
spiel.pack()
for h in range (2):
    for i in range (6):
        y[i]+=25
        x[i]-=135
    for j in range (4):
        for k in range (6):
            x[k]+=90
        polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]
                                        ,x[4],y[4],x[5],y[5],outline="black",fill=farbe) 
    farbe="orange"
master.mainloop() 
..bei Sechsecken denke ich automatisch an Siedler von Catan :wink:
bestimmt kannst Du mit dem kleinen Stück was basteln..
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 5. Juli 2008, 08:30

Wieso fängst du für dieselbe Sache einen neuen Thread an?

Und warum schaffst du es immer noch nicht, deinen Code in Code-Tags zu setzen?

Der Code von ~Mitneid~ hilft auch nicht wirklich weiter, auch wenn er schon ein ganzes Stück mehr kann als deiner.

Nachdem, was du uns bis jetzt gezeigt hast, kann ich dir nur dringend raten, eines der von mir genannten Module (xturtle oder frog) einzusetzen. Im übrigen gilt, was BlackJack im anderen Thread zum gleichen Thema gepostet hat:

Logik und Darstellung trennen, weg von den absoluten Koordinaten.
Weiter gilt, was ich schon geäußert habe: Der Weg über pures Tkinter wird vermutlich für dich zu steinig sein: Satz des Pythagoras und/oder trigonometrische Funktionen sind für einen ordentlichen Ansatz, der nicht auf von irgendwo her kommenden absoluten Koordinaten beruht, unvermeidlich.

Oder du verwendest eben xturtle oder frog, dann geht es ohne.

Zur Demonstration der Code mit frog-Modul:

Code: Alles auswählen

from frog import *

size = 30  # Seitenlaenge in px (variabel)

def draw_hexagon(color,pos):
    # hier habe ich 8 Zeilen ausgelassen, damit es nicht zu einfach wird ...

pool = Pool(width=600,height=400)
frog = Frog(pool, visible=False)
frog.color = "gray"
frog.fill = True
frog.pos = startpos = -270,130 # die einzigen absoluten Koordinaten
for y in xrange(6):
    for x in xrange(6):
        draw_hexagon("yellow",1)
        draw_hexagon("green",-1)
    frog.pos = startpos
    frog.turn(-120)
    for k in xrange(2):
        frog.jump(size)
        frog.turn(60)
    startpos = frog.pos
pool.ready()
Das Ergebnis sieht so aus:

Bild
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 10:51

das frog Modul ist sicher ein guter Tip. Ich wollte es halt nur ungerne verwenden, da ich mit dem Python Code als solches schon überfordert bin und dem Lesen der Bücher schon Unmengen zu tun habe. Trotz dass ich mir Zeit lassen möchte, bin ich leider auch ein klein wenig ungeduldig.

Aber ich werde den "Frosch" dann wohl doch benutzen, da es mir irgendwie doch die eifnachsten Möglichkeit erscheint.

Die Hexagone müssen 100 prozentig gleich sein.



Kai
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 10:54

Du musst dafür bbcode nehmen. Das heisst du schreibst den Code dafür in diese Klammern.

Code: Alles auswählen

from Tkinter import *

x=[100,130,145,130,100,85]
y=[100,100,126,152,152,126]
master = Tk()
farbe="green"
spiel = Canvas(master, width=900, height=600)
spiel.pack()
for h in range (2):
    for i in range (6):
        y[i]+=25
        x[i]-=135
    for j in range (4):
        for k in range (6):
            x[k]+=90
        polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]
                                        ,x[4],y[4],x[5],y[5],outline="black",fill=farbe)
    farbe="orange"
master.mainloop()
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 10:56

ok, das war nur ein Test -
Jetzt weiss ich auch wie ich den Code eingerückt einfügen kann.

Kai
imac
20 Zoll
2,4 ghz
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Samstag 5. Juli 2008, 11:13

derkai hat geschrieben:ok, das war nur ein Test -
Jetzt weiss ich auch wie ich den Code eingerückt einfügen kann.
Es gibt extra ein Unterforum zum Testen ;-)
Benutzeravatar
~Mitneid~
User
Beiträge: 5
Registriert: Samstag 5. Juli 2008, 04:59

Samstag 5. Juli 2008, 14:00

Das sieht cool aus mit Frog :)
Habe hier noch was Grobes, mit dem man einzelne Sechsecke setzen kann wo man will.

Code: Alles auswählen

from Tkinter import * 

kx=[1,2,3,1,1,7,8,7,7,8,7]  # kx gibt die X-Position (nach rechts) an, wo ein Sechseck hin soll
ky=[1,1,1,2,3,2,2,1,4,4,5]  # ky gibt die y-Position (nach unten) an , wo ein Sechseck hin soll
# es entstehen so Paare (kx0/ky0),(kx1/ky1),kx2/ky2) hier im Programm (1/1),(2/1),(3/1),(1/2),...(8/4),(7/5)
sx=[15,45,60,45,15,0] 
sy=[0,0,26,52,52,26]
x=[0,0,0,0,0,0]
y=[0,0,0,0,0,0]

for i in range (6):
    x[i]+=200
    y[i]+=200
master = Tk() 
farbe=["lightgreen","green","darkgreen","dark olive green"
       ,"yellow","grey40","pink","lightgreen","green","darkgreen"
       ,"dark olive green","yellow","grey40","pink","lightgreen"
       ,"green","darkgreen","dark olive green","yellow","grey40","pink"]
spiel = Canvas(master, width=900, height=600,bg="blue") 
spiel.pack()

for i in range (len(kx)):
    for j in range (6):
        x[j]=90*kx[i]+sx[j]
        y[j]=25*ky[i]+sy[j]
    if ky[i]/2==ky[i]/2.0:
        for p in range (6):
            x[p]=x[p]-45
    polygone = spiel.create_polygon(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3] 
                                        ,x[4],y[4],x[5],y[5],outline="black",fill=farbe[i])

master.mainloop() 
Der Mensch ist weder Engel noch Tier, und das Unglück will es, dass, wer einen Engel aus ihm machen will, ein Tier aus ihm macht.
Blaise Pascal (1623-1662)
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 14:50

hey klasse !!! viele Dank.

Ehrlich gesagt verstehe ich zwar noch nicht alles in Deinem Code,
aber wenn ich mich nicht täusche, dann sind die Hexagone nicht
100 prozentig gleich, oder ?

15 / 45 = 30
45 / 60 = 25

Code: Alles auswählen

for i in range (6):
    x[i]+=200
    y[i]+=200
Was passiert hier ? und Warum ?

Kai
imac
20 Zoll
2,4 ghz
DasIch
User
Beiträge: 2478
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 5. Juli 2008, 16:05

derkai hat geschrieben:

Code: Alles auswählen

for i in range (6):
    x[i]+=200
    y[i]+=200
Was passiert hier ? und Warum ?
Es wird auf die ersten 6 Werte in x bzw. y 200 addiert. 200 wird hier die Seitenlänge sein.

Mir erschliesst sich aber auch nicht wieso man in Zeile 8 und 9 nicht gleich 200 statt 0 genommen hat...
Benutzeravatar
~Mitneid~
User
Beiträge: 5
Registriert: Samstag 5. Juli 2008, 04:59

Samstag 5. Juli 2008, 16:15

Servus

Bin immernoch im Schlafdefizit :-)
Die X-Koordinaten habe ich aus Deinem ursprünglichen Versuch.
Ich habe die x1 bis x6 Koordinaten genommen und 85 davon abgezogen
x1 war bei Dir 100 und ich hab dann 100-85=15 draus gemacht.
Sollte ich mich nicht verrechnet haben, dann sind meine so schief wie Du sie vorgegeben hast. Bin wie gesagt noch nicht richtig wach, aber mit zusammengepressten Augen sehen die Sechsecke ok für mich aus.
Heute rechne ich das aber nicht mehr nach :-)

Code: Alles auswählen

for i in range (6): 
    x[i]+=200 
    y[i]+=200 
Tja Du hast vollkommen recht. Da passiert gar nichts. Es war gedacht um die gesamte Karte horizontal (x Werte) oder vertikal (y Werte) ausrichten zu können... :oops:
einfach den Teil ignorieren/rausschneiden

hier einfach dafür was dranhängen

Code: Alles auswählen

x[j]=90*kx[i]+sx[j]-40 #verschiebt alles um 40 nach links
y[j]=25*ky[i]+sy[j]-10# verschiebt um 10 nach oben... 

also einfach andere Zahlen für -40 und -10 zum Ausrichten..
bitte um Verzeihung :-)
Der Mensch ist weder Engel noch Tier, und das Unglück will es, dass, wer einen Engel aus ihm machen will, ein Tier aus ihm macht.
Blaise Pascal (1623-1662)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 5. Juli 2008, 17:06

Vielleicht habe ich den Versuch, Battletech nachzubauen, schon mal mit einem entsprechenden Hinweis verstehen, vielleicht nicht. Ich halte es nach wie vor für einfacher, das mit HTML als UI zu machen.

Wenn man nur eine einheitliche Hexkarte ohne Geländemerkmale braucht, reicht ein PNG, welches in den Hintergrund gepackt ein natloses Hexgrid ergibt. Die Riesenroboter malt man dann mit 6 verschiedenen (eines pro Richtung) PNGs pro Fraktion per absoluter Positionierung darauf.

Code: Alles auswählen

\__/  
/  \__
Dies macht es aber recht schwer, z.B. Reichweiten von Waffensystemen anzuzeigen. Wenn es nur z.B. die Reichweiten von 1-6 Felder gäbe, könnte man sich mit 6 vorbereiteten transluzenten Kreisgrafiken behelfen. Optimal ist es nicht, dafür sehr schnell.

Alternativ kann man ein PNG pro Hexfeld nehmen. Dann lässt sich z.B. auch ein Kegel oder eine andere Form, die Hinternisse berücksichtigt, durch das individuelle Hervorheben von Feldern visualisieren.

Schreibt man die PNGs einfach hintereinander, sieht es für jeweils zwei Zeilen so aus

Code: Alles auswählen

 __  __  __  __
/  \/  \/  \/  \
\__/\__/\__/\__/  
und dann wird jedes zweite Hexfeld per relativer Positionierung nach links und unten verschoben, sodass sich die gewohnte Darstellung ergibt

Code: Alles auswählen

 __    __
/  \__/  \__
\__/  \__/  \
   \__/  \__/
Stefan
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 17:19

nee nee, schon ok.
ich freue mich ja, das sich soo viele melden und etwas schreiben.

Es ist halt nur so, dass ein I Dötzchen wie ich, es halt enorm schwer
hat auch nur ganz simple Dinge zu verstehen.
Ich beschäftige mich mit Python noch nicht so lange.

Gruß
Kai
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Samstag 5. Juli 2008, 17:32

das mit den PNG´s klingt interessant, aber was ist das ?

Kai
imac
20 Zoll
2,4 ghz
Antworten