verdammt, ich kapier es einfach nicht

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

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

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

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

alles klar, ich werde es umschreiben

Kai
imac
20 Zoll
2,4 ghz
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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
imac
20 Zoll
2,4 ghz
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

[wiki]Import[/wiki], aber irgendwie habe ich das Gefühl, dass du dich da generell etwas übernimmst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

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

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

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

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

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

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

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

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

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

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

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

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