verdammt, ich kapier es einfach nicht

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

Freitag 22. August 2008, 19:09

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

Freitag 22. August 2008, 19:13

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

Freitag 22. August 2008, 19:24

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

Freitag 22. August 2008, 19:54

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

Freitag 22. August 2008, 20:15

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

Freitag 22. August 2008, 20:45

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

Freitag 22. August 2008, 21:28

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: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 22. August 2008, 21:28

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

Freitag 22. August 2008, 21:36

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

Freitag 22. August 2008, 21:40

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: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 22. August 2008, 21:49

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: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 22. August 2008, 21:58

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

Freitag 22. August 2008, 22:00

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: 1483
Registriert: Sonntag 8. Juni 2003, 09:50

Freitag 22. August 2008, 22:05

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

Samstag 23. August 2008, 12:17

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/
Antworten