Seite 13 von 16

Verfasst: Samstag 16. August 2008, 23:06
von derkai
so geht es, aber warum ?

es fehlt doch der Befehle : scrollbarcommand=xxx.set

Code: Alles auswählen

from Tkinter import *
from funktionen import *

#Hauptfenster erzeugen
spiel = Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Fenster fuer Canvas
fenster1 = Frame (spiel,width=650,height=700)
fenster1.place(x=350, y=46)

#Canvas im Frame Fenster1
spflaeche = Canvas (fenster1,width=1074,height=768)
spflaeche.place(x=0,y=0)

#Spielflache erstellen
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :
    
    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")

#Scrollbar erstellen
xleiste = Scrollbar (fenster1,orient=HORIZONTAL,width=324)
xleiste.config(command=spflaeche.xview)
xleiste.place(x=2,y=685)




#Titel fuer Canvas
besch1 = Label (spiel,text ="Spielfaeche",fg="red",bg="grey")
besch1.place(x=350,y=20)


spiel.mainloop()

Verfasst: Sonntag 17. August 2008, 07:16
von numerix
Ganz andere Sache:
Du solltest dich unbedingt vom place-Geometriemanager verabschieden. Das ist bestenfalls etwas für die allerersten Anfänge (und selbst da eigentlich überflüssig). Nimm dir mal Zeit für pack() (das scheint mir in deinem Fall das Richtige zu sein) oder grid().

Wenn du das Fenster z.B. mit der Maus aufziehst oder verkleinerst, zerhaut es dir momentan noch das ganze Layout. Das muss aber nicht sein.

Und: Dringende Empfehlung Tkinter nicht mittels Sternchenimport einzubinden!

Verfasst: Sonntag 17. August 2008, 09:58
von derkai
welches Modul importiere ich denn dann ?

from Tkinter import ... ?

Pack gucke ich mir gerne noch einmal an.
Aber auch mit place gibt es relative Möglichkeiten der Platzierung

Kai

Verfasst: Sonntag 17. August 2008, 10:41
von BlackJack
Höchstens relativ zu anderen absoluten Koordinaten. Wenn Du eine GUI haben möchtest, die nicht nur bei auf Deinem Rechner, mit Deiner Bildschirmauflösung und Deinen Schriften und Schriftgrössen funktioniert, dann ist `place()` nicht brauchbar.

Zum Import: Entweder Du importierst alle Namen, die Du verwendest explizit, oder Du importierst halt nur das Modul und greifst über das Modulobjekt auf den Inhalt zu. Hat den Vorteil, dass man auch im Quelltext sieht, wo etwas her kommt. Da der Name `Tkinter` etwas lang ist, binden die meisten Leute das Modul beim Importieren an einen kürzeren Namen: ``import Tkinter as tk``.

Verfasst: Sonntag 17. August 2008, 10:53
von derkai
alles klar, ich werde es umschreiben

Kai

Verfasst: Sonntag 17. August 2008, 11:31
von derkai
so etwa ?
aber wie greife ich nun drauf zu ?

Code: Alles auswählen

import Tkinter as tk 
from funktionen import *

#Hauptfenster erzeugen
spiel = tk
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")
spiel.config führt nun zu einem Fehler

Kai

Verfasst: Sonntag 17. August 2008, 11:35
von Leonidas
[wiki]Import[/wiki], aber irgendwie habe ich das Gefühl, dass du dich da generell etwas übernimmst.

Verfasst: Sonntag 17. August 2008, 11:37
von derkai
so könnte ich alle Namen einzeld importieren,
was aber zu umständlich ist.

Code: Alles auswählen

from Tkinter import Tk, Canvas,Scrollbar
from funktionen import *

#Hauptfenster erzeugen
spiel = Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")
wenn ich den Import mit einem neuen Namen AS XXXX importiere,
dann kann ich auch nur über diesen neuen Namen zugreifen.

Aber wie ?

Kai

Verfasst: Sonntag 17. August 2008, 11:39
von derkai
@leonidas
ja, das kann schon sein.

Für jeden Schritt frage ich tausend mal nach und fast jede Zeile
Code dauert Stunden.

Aber bisher ging es doch noch immer wieder vorwärts. Und so
lange das so ist, und Ihr mir weiter so schön helfen möchtet
versuche ich es weiter.

Danke für den TIP : IMPORT

Kai

Verfasst: Sonntag 17. August 2008, 13:08
von derkai
wie sage ich denn jetzt, dass das CANVAS in der rechten unteren
Ecke bündig platziert werden soll ??
Mit PLACE getht das gut (ich habe aber verstanden, dass ich das
nicht nehmen soll) mit PACK kriege ich es nicht hso hin.

Code: Alles auswählen

import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Canvas im Hauptfenster
spflaeche = tk.Canvas (spiel,width=650,height=660)
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :
    
    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")

spflaeche.pack(side=tk.RIGHT,padx=10)

spiel.mainloop()

Verfasst: Sonntag 17. August 2008, 13:16
von derkai
also mit pack sieht das aber echt "Banane" aus.

Der macht die Widgets ja gar nicht nach "SE, oder BOTTOM"

Sicher mache ich wieder was falsch, oder ?

Code: Alles auswählen

import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Canvas im Hauptfenster
spflaeche = tk.Canvas (spiel,width=650,height=660)
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :
    
    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")

spflaeche.pack(side=tk.RIGHT,padx=10)

#Scrollbar erstellen
xleiste = tk.Scrollbar (spiel,orient=tk.HORIZONTAL)
xleiste.config(command=spflaeche.xview)
xleiste.pack(anchor=tk.SE,fill=tk.X)

#Titel fuer Canvas
besch1 = tk.Label (spiel,text ="Spielfaeche",fg="red",bg="grey")
besch1.pack(anchor=tk.SE)


spiel.mainloop()

und er Scrollbalken funktioniert auch nicht so, wie ich mir das vorgestellt
habe. Eigentlich müßte doch das Ende links und das Ende rechts auch das
Ende der Spielfläche darstellen, oder ?
Nach rechts kann man aber "unendlich" weit scrollen, obwohl das Spielfeld
schon lange zu Ende ist. Das sieht total doof aus

Verfasst: Sonntag 17. August 2008, 13:55
von BlackJack
Bündig rechts unten etwas zu platzieren macht nur bei absoluten Koordinaten wirklich Sinn. Das bedeutet ja, dass oben und/oder links etwas frei bleibt, aber das setzt ja schon wieder voraus, dass man die freien Flächen selbst irgendwie erschaffen hat.

Du solltest aufhören dem Fenster eine Höhe und Breite geben zu wollen. Diese Dimensionen werden davon bestimmt, was in dem Fenster enthalten ist.

Bei `pack()` darf man nicht verschiedene Richtungen innerhalb eines Containers mischen. Wenn Du ein Widget rechts platzierst musst Du das auch mit allen anderen machen.

Wenn Du `side` nicht angibst, wird 'top' verwendet, Du mischt also 'right' und 'top'.

Mit `anchor` gibst Du an, wo das Widget im zur Verfügung stehenden Platz verankert wird. Bei 'top' und 'bottom' ist der zur Verfügung stehende vertikale Platz immer nur so hoch wie das Widget selbst und bei 'left' und 'right' trifft das auf den horizontalen Platz und die Breite des Widgets zu.

Beim Skrollbalken hat 'SE' gar keinen Effekt, weil der die gesamte Breite des Platzes einnimmt und so hoch ist, wie das Widget eben hoch ist. Da ist kein freier Platz drum herum, deshalb ist die Verankerung egal.

Das Label wird bei 'SE' dagegen linksbündig ausgerichtet wenn das Fenster bzw. der Platz breiter ist, als der Text in Anspruch nimmt.

Verfasst: Sonntag 17. August 2008, 14:05
von derkai
aber das würde ja bedeuten, dass man in der Gestaltung total eingeschränkt ist. Warum ist es unlogisch zu sagen, dass ich :

- einen Frame erzeuge, der dann ein Canvas und eine Scrollbar
aufnehmen soll.

Und aus Gründen der Optik und weil später noch einige Widgets dazu kommen sollen, SOLL die Spielfläche nach rechts unten ?

Kai

Verfasst: Sonntag 17. August 2008, 14:06
von numerix
Wie es nicht geht, hat BlackJack ja schon gepostet.

Eine mögliche Lösung wäre die Verwendung von frames (im Sinne des Frame-Widgets). Das sind in Tkinter lediglich Container, die zwar sichtbar gemacht werden können, aber nicht müssen. Solche frames kannst du nutzen, um bestimmte Teile zu gruppieren.

In deinem Fall also z.B. einen linken und einen rechten frame; im rechten frame werden dann die Spielfläche und der Scrollbalken hineingepackt.
Und dann solltest du dir noch die Option "expand" des pack()-Managers ansehen, und überlegen, welches Verhalten zu gerne hättest, wenn jemand z.B. das Fenster größer zieht.

Verfasst: Sonntag 17. August 2008, 14:11
von derkai
ja, das ist ne Idee.

Aber trotzdem noch ne Frage zu den Größenangaben.

wenn ich folgenden Code nehme :

Code: Alles auswählen

import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()
spiel.config(width=1024,height=768,bg="grey")
spiel.title("Kai s Battle Game")

#Canvas im Frame Fenster2
spflaeche = tk.Canvas(spiel)
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

for x in hexdic.iterkeys() :

    spflaeche.create_polygon (hexdic[x][0],fill=hexdic[x][2],outline="black")

spflaeche.pack(anchor=tk.NW,padx=25,pady=30)




spiel.mainloop()
Woher weiss python dann, wie gross es das Canvas Feld erstellen soll ?
Mir ist das nämlich zu klein

Kai

Verfasst: Sonntag 17. August 2008, 14:40
von numerix
Probier das mal ...

Code: Alles auswählen

Import Tkinter as tk

spiel = tk.Tk()
spiel.geometry("1024x768")
spflaeche = tk.Canvas(spiel,bg="white")
spflaeche.pack(expand=True,fill=tk.BOTH,padx=25,pady=30)
spiel.mainloop()

Verfasst: Sonntag 17. August 2008, 14:41
von derkai
ich glaube, dass Problem fängt viel weiter oben an.

Ein Frame ist lt. meinen Büchern "unsichtbar", es sei denn
man weisst ihm einen anderen Rahmen zu.
Das habe ich getan, sehe aber immer noch keinen Frame

Liegt das am MAC ?

Kai

Verfasst: Sonntag 17. August 2008, 15:11
von numerix
Verstehe ich nicht. Probier das mal:

Code: Alles auswählen

import Tkinter as tk

spiel = tk.Tk()
spiel.geometry("1024x768")
linkeseite = tk.Frame(spiel,bg="tomato",width=100)
linkeseite.pack(side=tk.LEFT,fill=tk.Y)
rechteseite = tk.Frame(spiel,bg="peachpuff")
rechteseite.pack(side=tk.LEFT,fill=tk.BOTH,expand=True)
spflaeche = tk.Canvas(rechteseite,bg="white")
spflaeche.pack(expand=True,fill=tk.BOTH,padx=25,pady=30)
spiel.mainloop()

Verfasst: Sonntag 17. August 2008, 15:23
von derkai
das funktioniert, ich meinte aber die Rahmen der FRAMES.
Attribute -> relief

[/code]import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()
spiel.geometry("1024x768")
spiel.title("Kai s Battle Game")

#Frame1 erzeugen
fenster1 = tk.Frame(spiel,padx=10,pady=10)
fenster1.config(relief=tk.RAISED)
fenster1.pack()




spiel.mainloo

Verfasst: Sonntag 17. August 2008, 15:23
von derkai
das funktioniert, ich meinte aber die Rahmen der FRAMES.
Attribute -> relief

Code: Alles auswählen

import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()
spiel.geometry("1024x768")
spiel.title("Kai s Battle Game")

#Frame1 erzeugen
fenster1 = tk.Frame(spiel,padx=10,pady=10)
fenster1.config(relief=tk.RAISED)
fenster1.pack()




spiel.mainloo