verdammt, ich kapier es einfach nicht

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

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

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

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

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

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

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

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: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

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

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: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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

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

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

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

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

Kai
imac
20 Zoll
2,4 ghz
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

PNG ist ein Bildformat, was ein Webbrowser anzeigen kann und das Transparenz und Transluzenz unterstützt.

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

ok, dank Eurer Hilfe bin ich nun einen Schritt weiter :

Code: Alles auswählen

from frog import *
from random import *

size = 20                               #Groesse Hexfeld

pool = Pool(width=1024,height=768,bgcolor="black") #Groesse Pool Spielflaeche
frog = Frog(pool)

level1=182,116,23                       #braun = Boden                
level2=13,166,20                        #gruen = Wald
level3=53,66,244                        #blau  = Wasser

Level = (level1,level1,level2,level1,
         level1,level1,level3,level1,
         level1,level1,level1,level1,
         level2,level1,level1,level1,
         level1,level1,level1,level1,
         level1,level1,level1,level1)   #Random Mischer

frog.animate=False
frog.visible=False
frog.speed = 10
frog.width=2
frog.fill=True


y =  370
for k in range(20):
        x = - 490
        y = y - 36
        frog.pos = x,y
        for k in range(17):
                for k in range(6):
                        frog.move(size)
                        frog.turn(60)
                        frog.fillcolor = choice(Level)
                frog.jump(60)

y =  352
for k in range(20):
        x = -460
        y = y - 36
        frog.pos = x,y
        for k in range(16):
                for k in range(6):
                        frog.move(size)
                        frog.turn(60)
                        frog.fillcolor= choice(Level)
                frog.jump(60)

pool.ready()
... aber warum dauert der Aufbau soooooo lange ?

Kai
imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Glückwunsch, das ist doch mal ein Erfolg!

Das dauert so lange, weil du
a) eine Riesenmenge an Zeichenoperationen vornimmst (die aber auch nötig sind)
b) das frog-Modul nicht unbedingt auf höchste Performance ausgerichtet ist
c) das darunter liegende Tkinter dies ebenfalls nicht ist

Darüber hinaus ist anzumerken:
a) Jedes gezeichnete Element auf einem Tkinter-Canvas wird als Item geführt; dein Spielfeld bringt es auf 660 Items (kannst du mit frog.items abfragen) und mit steigender Zahl an items werden die Grafikoperationen immer langsamer
b) Das frog-Attribute animate ist veraltet (es bewirkt einfach gar nichts mehr); um die max. Geschwindigkeit zu erreichen, setzt man frog.speed = "max".
c) Eine deutliche Geschwindigkeitssteigerung könnte man dadurch erreichen, dass man eine neu frog-Shape in Gestalt eines Sechsecks definiert und dann mittels der Methode stamp() Abbilder dieses "Froschs" setzt. Allerdings ist man dann nicht mehr in der Größe der Sechsecke flexibel. Wie viel schneller das geht, habe ich aber nicht ausprobiert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ergänzung / Präzisierung / Korrektur zum letzten Post:

Die Idee mit dem Ansatz über die shape()-Methode des Froschs bringt keinen nennenswerten Geschwindigkeitsvorteil.

Der Verzicht auf das frog Modul bringt einen ganz erheblichen Geschwindigkeitsvorteil! Ich habe das ganze gerade mal mit "Tkinter pur" umgesetzt und - :shock: :shock: :shock: - das gesamte Spielfeld ist mit einem Schlag sofort sichtbar!

Die benötigte Mathematik hält sich auch in Grenzen, wenn du es geschickt anstellst; der Satz des Pythagoras genügt, Trigonometrie brauchst du nicht.

Allerdings wäre auch weiter zu überlegen, was dein künftiges Spiel sonst noch so leisten soll und ob man dann nicht ggf. die schlechte Performance des Froschs in Kauf nimmt, um weitere Elemente des Spiels dann ggf. in gut lesbarem Code und unter Verwendung einiger komfortabler Frosch-Methoden umzusetzen.
BlackJack

@numerix: Ohne mir den Frosch jetzt angeschaut zu haben: Kann es sein, dass der *absichtlich* langsam ist, damit man ihm beim Zeichnen zuschauen kann? Das ist doch im Grunde so'n "Lerndingens" wie die Schildkröten, oder?
Antworten