verdammt, ich kapier es einfach nicht

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

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
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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.
imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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
imac
20 Zoll
2,4 ghz
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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").
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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
imac
20 Zoll
2,4 ghz
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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo derkai

Was heisst:

Code: Alles auswählen

spielfeld.bbox("all")
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.
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Laut meiner Tkinter-Doku sollte bbox() ohne Parameter das gleiche leisten.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Bei mir leistet:

Code: Alles auswählen

spielfeld.bbox()
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
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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"?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix

Aus keinem Buch und auch aus keiner Dokumentation sondern durch analisieren von geschriebenen Code-Snippets.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 :wink:
Take it easy Mates!
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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
imac
20 Zoll
2,4 ghz
Antworten