Seite 16 von 16
Verfasst: Freitag 22. August 2008, 19:09
von derkai
wie gesagt, ich habe 5 Bücher gekauft.
In jedem davon steht ein bischen. Von bbbox steht nirgendwo
etwas.
Wenn es so eine Referenz auch auf Deutsch gäbe und mir
jemand sagen könnte, wo dieses zu finden ist, dann würde ich das tun !
Kai
Verfasst: Freitag 22. August 2008, 19:13
von derkai
im übrigen, ich habe gerade wuf´s Ideen bei mir eingebunden.
Das ganze sieht dann soooo aus :
Code: Alles auswählen
import Tkinter as tk
from funktionen import *
# hier wird das Spielfenster erstellt
spiel = tk.Tk()
# hier wird der linke Container der Spielflaeche erstellt
container1=tk.Frame(master=spiel,bd=3,relief=tk.RAISED)
container1.pack(side=tk.LEFT,fill=tk.Y)
# hier wird der Container der Spielflaeche erstellt
container2=tk.Frame(container1,bd=3,relief=tk.SUNKEN)
container2.pack(side=tk.TOP,padx=5,pady=5)
# hier werden die Scrollbalken erstellt
schieber_x = tk.Scrollbar(container2,orient=tk.HORIZONTAL)
schieber_x.pack(side=tk.BOTTOM,fill=tk.X)
schieber_y = tk.Scrollbar(container2,orient=tk.VERTICAL)
schieber_y.pack(side=tk.RIGHT,fill=tk.Y)
# hier wird das Spieldfeld erstellt und in Container2 eingebunden
spielfeld = tk.Canvas(container2,bg="white",width=500,height=450)
spielfeld.pack()
spielfeld.config(xscrollcommand=schieber_x.set)
spielfeld.config(yscrollcommand=schieber_y.set)
erstelle_hexfeldobjekte ()
for x in hexdic.iterkeys() :
spielfeld.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")
# hier werden die Scrollbalken verknuepft
schieber_x.config(command=spielfeld.xview)
schieber_y.config(command=spielfeld.yview)
# hier wird ein Container fuer die Miniansicht erstellt
container3=tk.Frame(container1,bd=3,relief=tk.SUNKEN)
container3.pack(side=tk.LEFT,padx=20)
# hier wird die Miniansicht erstellt
miniansicht = tk.Canvas(container3,bg="white",bd=2,width=294,height=215)
berechne_minidic()
for x in minidic.iterkeys() :
miniansicht.create_polygon (minidic[x][0],outline="black",fill=minidic[x][1])
miniansicht.pack()
if spielfeld.bbox('all'):
#Das Spielfeld enthaelt Garfikobjekte. Passe den Ziehberiech der
#Scrollbalken auf den neuen Inhalt (Hexagons) des Spielfeldes an
x1, y1, x2, y2 = spielfeld.bbox('all')
spielfeld.configure(scrollregion=(x1, y1, x2+2, y2+2))
spiel.geometry("1024x768")
spiel.mainloop()
Jetzt funktionieren auch die Scrollbalken GUT !!!
Es steht aber z.B nirgendwo in meinen Büchern so komplex, dass
ich bislang darauf gekommen wäre, dass hier auch die Reihenfolge
/ position im Code des "xscrollcommand" eine Rolle spielt.
@ numerix
Wie man einen Modellhubschrauber steuert, kann man auch nicht
aus Literatur lernen. Da zählt die Praxis und Übung.
Verfasst: Freitag 22. August 2008, 19:24
von numerix
derkai hat geschrieben:@ numerix
Wie man einen Modellhubschrauber steuert, kann man auch nicht
aus Literatur lernen. Da zählt die Praxis und Übung.
Aber zum Hubschrauber gibt's eine Anleitung, in der drinsteht, für was welcher Hebel da ist. Und in diese Kategorie fällt z.B. die Frage "Wofür ist bbox da".
Eine deutschsprachige Referenz zu Tkinter kenne ich nicht.
Verfasst: Freitag 22. August 2008, 19:54
von derkai
da hast du Recht. (und trotzdem fällt mir das Mist Ding immer mal wieder
runter)
Schade, denn mein Englisch ist für "um nach dem Weg zu fragen" noch
ok, aber für mehr langt es leider nicht.
Kai
Verfasst: Freitag 22. August 2008, 20:15
von numerix
derkai hat geschrieben:wie gesagt, ich habe 5 Bücher gekauft.
Wenn Michael Weigends "Objektorientiere Programmierung mit Python" dabei ist, dann hast du Glück: Da sind nämlich mehr als 100 Seiten über Tkinter drin. Soweit mir bekannt ist, gibt es kein anderes deutschsprachiges Buch, indem Tkinter so ausführlich behandelt wird.
Da taucht immerhin "bounding box" im Register auf und wird auf Seite 455 kurz erklärt. Unter den exemplarischen Canvas-Methoden auf der Seite davor ist bbox() aber dann leider nicht vertreten.
Also: bbox(tagOrID) liefert die vier Koordinaten der linken oberen und der rechten unteren Ecke des Items/Tags bzw. des das Item/Tag umgebenden Begrenzungskastens ("bounding box").
Verfasst: Freitag 22. August 2008, 20:45
von derkai
ja, der Michael ist dabei ...
und ich habe auch einmal Deinen Link verfolgt.
bbox und die Funktionsweise ist halbwegs klar.
es wird ein Tuple zurückgegeben mit Ecke links oben
und rechts unten
was heisst denn deutsch übersetzt
if spielfeld.bbox ("all") : ????
Was passiert da ?
Kai
Verfasst: Freitag 22. August 2008, 21:28
von BlackJack
Da wird der Wahrheitswert des Rückgabewertes von ``spielfeld.bbox('all')`` überprüft und nur wenn der "wahr" ist, wird der Code in dem ``if``-Block ausgeführt.
So als Tipp: Überleg mal und probier dann mal aus, was die Methode liefert, wenn so ein Canvas leer ist, also die Ausmasse von *Nichts* berechnet werden müssten.
Verfasst: Freitag 22. August 2008, 21:28
von wuf
Hallo derkai
Was heisst:
Die Methode 'bbox' gibt dir die Koordinaten x1/y1 und x2/y2 also die Eckpunkte eines Rechteckrahmens zurück, welcher alle ('all') grafischen Objekte (in unserem Falle sind dies vorläufig nur grafische Hexagon-Objekte) umfasst. Das heisst alle vorkommenden Grafik-Objekte befinden sich innerhalb dieses Rechteckrahmens. Mit den zurückgegebenen Koordinatenpunkte x1,y1......x2,y2 wird die Ziebereich der Scrollbalken neu justiert. Wenn du eine Spielfeld-Geometrie von 1000 mal 1000 Hexagons hast übersteigt dies die geometrischen Dimensione deines Bildschirmes (1024x768" um das mehrfache. Da du auf dem Bildschirm das Spielfeld nur mit der von dir vorgegebenen Geometrie von 500x450 (für das Canvas-Widget) als Auschnitt deines Spielfeldes siehst müssen die Scrollbalken nach einer neuen Platzierung aller Hexagons, neu kalibriert werden.
"all" ist eine Tkinter-Konstante und kann auch in deinem Code-Snippet auch als
tk.ALL geschrieben werden.
Verfasst: Freitag 22. August 2008, 21:36
von numerix
Laut meiner Tkinter-Doku sollte bbox() ohne Parameter das gleiche leisten.
Verfasst: Freitag 22. August 2008, 21:40
von wuf
Hallo derkai
Anwort zu diener ersten Frage. Die folgenden Anweisungen:
Code: Alles auswählen
# Binde die vertikale & horizontale Ziehleisten an die Canvas-Flaeche
spielfeld['xscrollcommand'] = schieber_x.set
spielfeld['yscrollcommand'] = schieber_y.set
schieber_x['command'] = spielfeld.xview
schieber_y['command'] = spielfeld.yview
können natürlich auch so geschrieben werden:
Code: Alles auswählen
spielfeld.config(xscrollcommand = schieber_x.set)
spielfeld.config(yscrollcommand = schieber_y.set)
schieber_x.config(command=spielfeld.xview)
schieber_y.config(command=spielfeld.yview)
Ok Gruss wuf

Verfasst: Freitag 22. August 2008, 21:49
von wuf
Hallo numerix
Bei mir leistet:
folgende Meldung:
Traceback (most recent call last):
File "frame_test_02_01.py", line 67, in <module>
x1, y1, x2, y2 = spielfeld.bbox()
File "/usr/local/lib/python2.5/lib-tk/Tkinter.py", line 2104, in bbox
self.tk.call((self._w, 'bbox') + args)) or None
_tkinter.TclError: wrong # args: should be ".1076538764.1076539244.1076555916.1076555980agOrId ?tagOrId ...?"
Gruss wuf
Verfasst: Freitag 22. August 2008, 21:58
von wuf
Hallo derkai
Du kanst folgendes:
Code: Alles auswählen
if spielfeld.bbox('all'):
# Das Spielfeld enthaelt Garfikobjekte. Passe den Ziehbereich der
# Scrollbalken auf den neuen Inhalt (Hexagons) des Spielfeldes an
x1, y1, x2, y2 = spielfeld.bbox('all')
spielfeld.configure(scrollregion=(x1, y1, x2, y2))
auch so schreiben:
Code: Alles auswählen
if spielfeld.bbox(tk.ALL):
# Das Spielfeld enthaelt Garfikobjekte. Passe den Ziehbereich der
# Scrollbalken auf den neuen Inhalt (Hexagons) des Spielfeldes an
bounding_box = spielfeld.bbox(tk.ALL)
spielfeld.configure(scrollregion=bounding_box)
Gruss wuf

Verfasst: Freitag 22. August 2008, 22:00
von numerix
Das ist interessant. Denn die - tatsächlich nicht funktionierende - Variante ohne Parameter findet man sowohl hier
http://effbot.org/tkinterbook/canvas.htm
als auch hier
http://infohost.nmt.edu/tcc/help/pubs/t ... thods.html
Woher hast du denn deine - funktionierende - Variante mit dem "all"?
Verfasst: Freitag 22. August 2008, 22:05
von wuf
Hallo numerix
Aus keinem Buch und auch aus keiner Dokumentation sondern durch analisieren von geschriebenen Code-Snippets.
Gruss wuf

Verfasst: Samstag 23. August 2008, 12:17
von birkenfeld
numerix hat geschrieben:
Woher hast du denn deine - funktionierende - Variante mit dem "all"?
Leute, vergesst nicht dass die Standardlib hauptsächlich in Form von .py-Dateien vorliegt...
Verfasst: Samstag 23. August 2008, 13:20
von numerix
birkenfeld hat geschrieben:Leute, vergesst nicht dass die Standardlib hauptsächlich in Form von .py-Dateien vorliegt...
Ja, stimmt schon. Vielleicht geht ihr "Profis" da auch anders ran. Ich lese lieber zunächst mal Dokumentation und nur wenn ich da nicht weiterkomme, wage ich mich an die Module selbst heran.
In diesem Fall ist es ja so, dass die inoffiziellen Tkinter-Referenzen übereinstimmend etwas beschreiben, was offenbar so nicht stimmt. Dass etwas nicht stimmt, merkt man aber erst, wenn man es braucht und bisher habe ich noch nie bbox() auf ein ganzes Canvas anwenden müssen.
Verfasst: Samstag 23. August 2008, 17:08
von wuf
Hallo derkai
Habe eine Frage zur Spielkarten-Erstellung (Map). Wie werden die grafischen Terrain-Symbole den einzelne Hexagonfeldern zugeordnet (z.B. 'Gras', 'leichtes Waldgebiet', 'Wüste' usw.). Wird dies zufällig geschehen (mit einem Random-Generator) oder wird die Karte mittels einem hierfür programmierten Editor (natürlich in Tkinter & Python) erfolgen?
Gruss wuf

Verfasst: Dienstag 26. August 2008, 19:09
von derkai
sorry, dass ich mich erst jetzt wieder melde -
ich hatte ein wenig wenig Zeit.
Bislang waren die Felder zufällig entstanden, allerdings
hatte auch ich schon die Idee, dass man dies ja sogar besser
in Form eines Editors machen könnte.
Ich werde aber zunächst noch versuchen den bisher geschriebenen
Code in die GUI mit einzubinden - rein um wieder etwas zu üben.
Dies betrifft vor allem die Bewegung eines "Bild - Panzers" (oder besser
gesagt von 6 Bild Panzern - für jede Ausrichtung einen) in das Spielfeld
mit ein zu beziehen.
Wenn mir das gelungen ist, dann könnte ich den "linken" Teil der GUI
weiter verwenden und auf dem rechten entsprechende Fenster schaffen,
die die Eigemschaften eines Feldes verändern können.
So als Zufallsprinzip machen die nicht unbedingt immer Sinn.
Weit aus schwieriger wird es allerdings, dass Endziel der Karte
zu verwirklichen. Es soll verschiedne Höehen Level geben.
Dafür muss aber später seitens der Logik eine Entscheidung getroffen
werden, ob die "Gegner" sich überhaupt sehen können.
Kai
Verfasst: Dienstag 26. August 2008, 19:11
von derkai
bisher lief es so :
Code: Alles auswählen
# -*- coding: utf-8 -*-
""" Modul zur Berechnung von Hexfeldobjekten"""
from math import sqrt, hypot
from random import choice
laenge = 25.0
spielreihen = 57
ungerade_spalten = 19
gerade_spalten = ungerade_spalten - 1
farbe = ("#F6C783",)*15+ ("#18C85A","#A0A6F5")
# braun gruen blau
hexdic = {} # Dictionary (x,y) : x1,y1 ... x6,y6
nachbardic = {} # Dictionary Nachbarfelder
minidic = {} # Dictionary Miniansicht
""" Funktion zur Berechnung der X,Y Koordinaten """
def berechne_felder (xpos, ypos) :
x1 = xpos
y1 = ypos
x2 = x1 + laenge
y2 = y1
x3 = x2 + (laenge/2.0)
y3 = y2 + ((laenge * sqrt(3.0)/2.0))
x4 = x2
y4 = (sqrt(3.0) * laenge) + y2
x5 = x1
y5 = y4
x6 = x1 - (laenge / 2.0)
y6 = y3
mittex = round((x1 + laenge /2.0),2)
mittey = round ((y3),2)
mitte = (mittex, mittey)
level = choice(farbe)
return (x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6),mitte,level