verdammt, ich kapier es einfach nicht

Fragen zu Tkinter.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 17. August 2008, 14:40

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

Beitragvon derkai » Sonntag 17. August 2008, 14:41

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

Beitragvon numerix » Sonntag 17. August 2008, 15:11

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

Beitragvon derkai » Sonntag 17. August 2008, 15:23

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[code=py][/code]
imac

20 Zoll

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

Beitragvon derkai » Sonntag 17. August 2008, 15:23

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

Beitragvon wuf » Sonntag 17. August 2008, 15:28

Hallo derkai

Die Konfiguration der Hauptfenster-Geometrie mittels:

Code: Alles auswählen

spiel.config(width=1024,height=768,bg="grey")


scheint Tkinter nicht so richtig zu mögen:

Es ist schon so, dass die Geometrie wie es das 'numerix' Beispiel zeigt über die Methode:

Code: Alles auswählen

spiel.geometry("1024x768")

konfiguriert werden sollte. Das unschöne daran ist nur noch, dass die Geometrie-Daten als String übergeben werden müssen.

Hier habe ich numerix Beispiel noch ein wenig erweitert:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#~~ Skriptname: kais_code_1511_01

import Tkinter as tk
from funktionen import *

#Hauptfenster erzeugen
spiel = tk.Tk()

# #~~ System Bildschirm-Grösse
# OS_SCREEN_WIDTH  = spiel.winfo_screenwidth()
# OS_SCREEN_HEIGHT = spiel.winfo_screenheight()
#
# #~~ Konstanten des Haupt-Fensters (Systembezogen)
# MAIN_WIN_WIDTH = OS_SCREEN_WIDTH
# MAIN_WIN_HEIGHT = OS_SCREEN_HEIGHT
# MAIN_WIN_XPOS = 0
# MAIN_WIN_YPOS = 0

#~~ Konstanten des Haupt-Fensters (Nach Vorgabe)
MAIN_WIN_WIDTH = 1024
MAIN_WIN_HEIGHT = 768
MAIN_WIN_XPOS = 0
MAIN_WIN_YPOS = 0

#~~ Geometrie für das Hauptfentser
spiel.geometry("%dx%d+%d+%d" % (MAIN_WIN_WIDTH, MAIN_WIN_HEIGHT, MAIN_WIN_XPOS,
    MAIN_WIN_YPOS))

spiel.title("Kai s Battle Game")

#Canvas im Frame Fenster2
spflaeche = tk.Canvas(spiel, bg="white")
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='top', fill='both', expand='yes', padx=25, pady=30)



spiel.mainloop()


Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 17. August 2008, 15:30

Du musst zusätzlich eine Randstärke einstellen (z.B. bd=2), damit relief funktioniert ...
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Beitragvon derkai » Sonntag 17. August 2008, 15:33

ja, ich habs in dem Moment auch geschnallt.
Nun versuche ich mal meine "Fläche" aufzubauen

DANKE
Kai
imac

20 Zoll

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

Beitragvon derkai » Sonntag 17. August 2008, 15:50

jetzt bleibt noch das Problem der Scrollbar :

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")
spiel.config(bg="grey")

#Frame1 erzeugen
fenster1 = tk.Frame(spiel,bg="white",width=500,
                    height=500,bd=3,relief=tk.SUNKEN)
fenster1.pack(anchor=tk.NW,padx=5,pady=5)

#Scrollbar erzeugen
xleiste = tk.Scrollbar(spiel,orient=tk.HORIZONTAL,width=200)
xleiste.pack(anchor=tk.NW,padx=10)

#Canvas im Hauptfenster
spflaeche = tk.Canvas (fenster1,width=490,height=490)
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

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

spflaeche.pack()

#Verknuepfung Scrollbar
xleiste.config(command=spflaeche.xview)


spiel.mainloop()


... die verhält sich echt "Sche..".
Das rechte Ende des Balkens ist irgendwo im Nirvana.

Was kann man denn dagegen tun ?

Kai
imac

20 Zoll

2,4 ghz
Benutzeravatar
wuf
User
Beiträge: 1366
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Sonntag 17. August 2008, 16:26

Hallo yipyip

Ich habe deinen Ratschlag auf folgender Tread-Seite befolgt:

http://www.python-forum.de/topic-15264,180.html

Einen Pfad von einem Feld (i, j) zu einem Feld (n, m)
kann man mit Hilfe eines 'Flood Fill' Algorithmus
bestimmen (rein informell):

1. Markieriere alle Felder als unbesucht
2. setze Feld(n, m) auf 0
3. setze die 6er-Nachbarn von Feld (n, m) auf 1
4. setze deren unbesuchte Nachbarn auf 2
5. deren unbesuchte auf 3
usw.
(Hindernisse werden nicht besucht.)


Hier die Spielfläche als nicht geflutet dargestellt:

[code=] Spielfläche Geometrie: 7x8

x: 0 1 2 3 4 5 6
y: -------------------------------------
0 | -1 -1 -1 -1 |
| -1 -1 -1 |
1 | -1 -1 -1 -1 |
| -1 -1 -1 |
2 | -1 -1 -1 -1 |
| -1 -1 -1 |
3 | -1 -1 -1 -1 |
| -1 -1 -1 |
4 | -1 -1 -1 -1 |
| -1 -1 -1 |
5 | -1 -1 -1 -1 |
| -1 -1 -1 |
6 | -1 -1 -1 -1 |
| -1 -1 -1 |
7 | -1 -1 -1 -1 |
| -1 -1 -1 |
-------------------------------------[/code]


Hier das Spielfeld auf zwei Ebenen geflutet. Das Zielfeld ist auf Koordinate 3,3:

[code=] Spielfläche Geometrie: 7x8

x: 0 1 2 3 4 5 6
y: -------------------------------------
0 | -1 -1 -1 -1 |
| -1 -1 -1 |
1 | -1 -1 -1 -1 |
| -1 2 -1 |
2 | -1 2 2 -1 |
| 2 1 2 |
3 | -1 1 1 -1 |
| 2 0 2 |
4 | -1 1 1 -1 |
| 2 1 2 |
5 | -1 2 2 -1 |
| -1 2 -1 |
6 | -1 -1 -1 -1 |
| -1 -1 -1 |
7 | -1 -1 -1 -1 |
| -1 -1 -1 |
-------------------------------------
[/code]


Hier das Spielfeld voll geflutet. Das Zielfeld ist immer noch auf Koordinate 3,3:

[code=] Spielfläche Geometrie: 7x8

x: 0 1 2 3 4 5 6
y: -------------------------------------
0 | 5 4 4 5 |
| 4 3 4 |
1 | 4 3 3 4 |
| 3 2 3 |
2 | 3 2 2 3 |
| 2 1 2 |
3 | 3 1 1 3 |
| 2 0 2 |
4 | 3 1 1 3 |
| 2 1 2 |
5 | 3 2 2 3 |
| 3 2 3 |
6 | 4 3 3 4 |
| 4 3 4 |
7 | 5 4 4 5 |
| 5 4 5 |
-------------------------------------[/code]


Hier das Spielfeld voll geflutet. Das Zielfeld ist in der untere rechten Ecke auf Koordinate 6,7:

[code=] Spielfläche Geometrie: 7x8

x: 0 1 2 3 4 5 6
y: -------------------------------------
0 | 10 9 8 7 |
| 9 8 7 |
1 | 9 8 7 6 |
| 8 7 6 |
2 | 8 7 6 5 |
| 7 6 5 |
3 | 7 6 5 4 |
| 6 5 4 |
4 | 6 5 4 3 |
| 5 4 3 |
5 | 6 4 3 2 |
| 5 3 2 |
6 | 6 4 2 1 |
| 5 3 1 |
7 | 6 4 2 0 |
| 5 3 1 |
-------------------------------------[/code]


Das Spielfeld enthält noch keine Hindernisse!

@vipvip Frage: Habe ich deinen Ratschlag richtig interpretiert? Ich wäre die dankbar, wenn du mir dies bestätigen könntest.

Gruss wuf :wink:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Sonntag 17. August 2008, 17:12

Ja genau, das meinte ich.
:D
Jetzt kann man das Hexfeld
(ich hab's bisher nur auf Pixelfeldern mit 4/8er-Nachbarschaft ausprobiert)
entsprechend den Nachbarschaftswerten mit
passenden Farben einfaerben, so dass sich 'schoene'
Farbverlaeufe ergeben; insbesondere mit 'Verzerrungen'
durch Hindernisse.
Dann erhaelt man eine Visualisierung der von mir schon
beschriebenen Pfadplanungsmethode.
(Von hohen Werten zu niedrigeren laufen...)
Ich befuerchte aber, das schweift im Moment
noch etwas vom Thema ab...

:wink:
yipyip
Benutzeravatar
wuf
User
Beiträge: 1366
Registriert: Sonntag 8. Juni 2003, 09:50

Beitragvon wuf » Sonntag 17. August 2008, 17:51

Hallo yipyip

Besten Dank für deine positive Antwort! Super! Unglaublich wie es möglich ist mit nur einer fünf Punkte-Beschreibung ohne komplizierte seitenlangen mathematischen Abhandlungen etwas rüberzubringen, so das beim Empfänger die Lampe zu leuchten anfängt. :lol:

Ich habe dich schon richtig verstanden, dass dies die Basis ist für eine Pfadsuche von einem Startfeld zu einem Zielfeld indem vom Startfeld beginnend immer das Nachbarfeld mit der nächst tieferen Flut-Nummer gesucht wird bis das Zielfeld mit der Flut-Nummer '0' gefunden wird?

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Sonntag 17. August 2008, 18:07

derkai hat geschrieben:jetzt bleibt noch das Problem der Scrollbar :
Das rechte Ende des Balkens ist irgendwo im Nirvana.
Was kann man denn dagegen tun ?


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",bd=3,relief=tk.SUNKEN)
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)
schieber = tk.Scrollbar(rechteseite,orient=tk.HORIZONTAL)
schieber.pack(fill=tk.X)
spiel.mainloop()
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Beitragvon yipyip » Sonntag 17. August 2008, 19:26

Ich habe dich schon richtig verstanden, dass dies die Basis ist für eine Pfadsuche von einem Startfeld zu einem Zielfeld indem vom Startfeld beginnend immer das Nachbarfeld mit der nächst tieferen Flut-Nummer gesucht wird bis das Zielfeld mit der Flut-Nummer '0' gefunden wird?

Haargenau... :D
Aufgrund der Konstruktion des Flood-Fill Algo findet man immer ein Feld mit einem kleinerem Wert, deshalb ist der Begriff "Nachbarschaft" von so entscheidender Bedeutung.

Im Allgemeinen existieren natuerlich mehrere Wege, aber solange die Spiellogik es nicht verbietet, kann man
das naechste Feld fuer den Pfad zufaellig auswaehlen.

(Immer vorausgesetzt, das Startfeld ist nicht isoliert
vom Zielfeld.)

Hat man jedoch Spielkriterien wie
'zuegig befahrbar'
...
'schwer befahrbar'
fuer ein Feld, landet man wieder bei einem Graphen mit gewichteten Kanten, d.h. Dijkstra usw. .

:wink:
yipyip
derkai
User
Beiträge: 169
Registriert: Montag 12. Mai 2008, 11:43

Beitragvon derkai » Montag 18. August 2008, 18:35

ich verstehe die Logik bei pack einfach nicht.
Warum kann ich jetzt neben die Spielfläche kein Widget positionieren ?

Kai

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")
spiel.config(bg="grey")

#Frame1 erzeugen
fenster1 = tk.Frame(spiel,bg="white",width=500,
                    height=500,bd=2,relief=tk.SUNKEN)
fenster1.pack(anchor=tk.NW,padx=2,pady=2)

#Scrollbar erzeugen
xleiste = tk.Scrollbar(fenster1,orient=tk.HORIZONTAL)
yleiste = tk.Scrollbar(fenster1,orient=tk.VERTICAL)
xleiste.pack(side=tk.BOTTOM,pady=2,fill=tk.X)
yleiste.pack(side=tk.RIGHT,pady=2,fill=tk.Y)

#Canvas im Hauptfenster
spflaeche = tk.Canvas (fenster1,width=495,height=495)
erstelle_hexfeldobjekte (spielreihen, ungerade_spalten)

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

spflaeche.pack(fill=tk.X)

#Verknuepfung Scrollbar
xleiste.config(command=spflaeche.xview)
yleiste.config(command=spflaeche.yview)

#Frame2 erzeugen -> Miniaturansicht
fenster2 = tk.Frame(spiel,bg="white",width=200,height=200,
                   bd=2,relief=tk.SUNKEN)
fenster2.pack(side=tk.RIGHT,expand=1)


spiel.mainloop()
imac

20 Zoll

2,4 ghz

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder