Seite 1 von 2

Variablen Namen in Schleife ansprechen...

Verfasst: Freitag 7. Dezember 2007, 16:48
von nemomuk
Hallo,

folgendes Problem stellt sich mir:
Ich habe Variablennamen, die durchnummeriert sind... und würde diese gerne in einer Schleife ansprechen...

Bsp:

Code: Alles auswählen

for x in range(1,5):
    variable_+x="irgendein wert"
Danke!

Verfasst: Freitag 7. Dezember 2007, 16:52
von BlackJack
Lösung: Variablennamen nicht durchnummerieren, sondern eine Liste verwenden.

Verfasst: Freitag 7. Dezember 2007, 16:59
von nemomuk
ja, das würde ich gerne, aber ich weiß nicht wie ich das besser anstellen kann in meiner Situation:

Code: Alles auswählen

schafkopfblatt = [
					["7","Herz"],
					["8","Herz"],
					["9","Herz"],
					["Unter","Herz"],
					["Ober","Herz"],
					["Koenig","Herz"],
					["10","Herz"],
					["Sau","Herz"],
					
					["7","Schelln"],
					["8","Schelln"],
					["9","Schelln"],
					["Unter","Schelln"],
					["Ober","Schelln"],
					["Koenig","Schelln"],
					["10","Schelln"],
					["Sau","Schelln"],
					
					["7","Eichel"],
					["8","Eichel"],
					["9","Eichel"],
					["Unter","Eichel"],
					["Ober","Eichel"],
					["Koenig","Eichel"],
					["10","Eichel"],
					["Sau","Eichel"],
					
					["7","Gras"],
					["8","Gras"],
					["9","Gras"],
					["Unter","Gras"],
					["Ober","Gras"],
					["Koenig","Gras"],
					["10","Gras"],
					["Sau","Gras"]
				]

bild_blatt1_1 = PhotoImage(file="irgendein_bild")

for x in schafkopfblatt:
		zahl, farbe = x
		
	spielblatt1_1 = Label(gui,image=bild_blatt1_1)
        etc. (weitere 31 Bilder)

spielblatt1_1.pack()
Ich brauche in diesem Fall 32 Bilder, die Liste mische ich mit shuffle() und dann muss ich der Reihe nach 32 Karten ausgeben und in meiner GUI ausgeben...

Geht das irgfendwie schöner

Danke![/code]

Verfasst: Freitag 7. Dezember 2007, 17:18
von BlackJack
Naja, wie schon gesagt: Listen verwenden. So gut wie immer wenn man ``name_nr`` mit verschiedenen Nummern im Quelltext stehen hat, kann man das in ``name[nr] `` umformulieren. Beziehungsweise kann man sich in Python den Index dann oft sparen weil man die Listen mit `append()` erstellen und später direkt über die Elemente iterieren kann.

Das `x` in dem Quelltext kannst Du übrigens einsparen, es geht auch so:

Code: Alles auswählen

for zahl, farbe in schafkopfblatt:
    # ...

Verfasst: Freitag 7. Dezember 2007, 17:31
von nemomuk
Vielen Dank!

Hast duu da vllt. irgendeine Anleitung, finde da grad nichts dazu, weil so gut kenn ich mich jetzt nicht mit Python aus, um aus deiner Erklärung "viel" schlauer zu werden...

Danke!

Verfasst: Freitag 7. Dezember 2007, 18:24
von BlackJack
Das Pythontutorial aus der Dokumentation. Oder jedes andere. Listen sind neben Dictionaries wirklich eine der grundlegensten Datenstrukturen in Python.

Verfasst: Freitag 7. Dezember 2007, 18:59
von kaytec
Hallo SchneiderWeise !

Du kannst in deine Liste gleich den Photoimage-Pfad speichern und musst diesen nicht explizit angeben. Schaue mal www.python-forum.de/topic-12840.html hier.

gruß frank

Verfasst: Samstag 8. Dezember 2007, 08:21
von nemomuk
Danke nochmal...

aber leider komm ich immer noch nicht drauf, wie ich das machen soll, auch nachdem ich das Tutorial angeschaut habe.

Code: Alles auswählen

schafkopfblatt = [
					["7","Herz","bilder/spielblatt/7_Herz.jpg"],
					["8","Herz","bilder/spielblatt/8_Herz.jpg"],
					["9","Herz","bilder/spielblatt/9_Herz.jpg"]
                        ]
for zahl,farbe,pfad in schafkopfblatt:
        spielblatt1_1 = Label(gui,image=pfad)
	spielblatt1_2 = Label(gui,image=pfad)
	spielblatt1_3 = Label(gui,image=pfad)
        #etc. insgesamt 32 Labels...

spielblatt1_1.pack()
spielblatt1_2.pack()
spielblatt1_3.pack()
#etc. insgesamt dann auch 32 Karten
Anstatt diese ganzen Labels hinzuschreiben wurde gesagt, dass ich Listen verwenden soll, aber wie mache ich das?

Vielen Dank!

Verfasst: Samstag 8. Dezember 2007, 10:50
von BlackJack
Vor der Schleife erstellst Du eine leere Liste und in der Schleife kommen dort dann die ganzen `Label`-Objekte rein.

Verfasst: Samstag 8. Dezember 2007, 10:58
von Leonidas
SchneiderWeisse hat geschrieben:Anstatt diese ganzen Labels hinzuschreiben wurde gesagt, dass ich Listen verwenden soll, aber wie mache ich das?
Nein, es wurde gesagt, dass du statt Variablen durchzunummerieren du Listen verwenden sollst.

Und da das Listen schreiben unlustig ist, hier mal eine bessere Lösung. Damit spart man sich die ganzen Pfade immer eingeben zu müssen.

Code: Alles auswählen

farben = set(('Eichel', 'Gras', 'Herz', 'Schellen'))
werte = set(range(6, 11) + ['A', 'O', 'U'])
kombiniert = set()
for farbe in farben:
    for wert in werte:
        kombiniert.add((farbe, wert))

def get_blatt(farbe, wert):
    return "bilder/spielblatt/%s_%s.jpg" % (wert, farbe)

for item in kombiniert:
    print get_blatt(*item)

Verfasst: Samstag 8. Dezember 2007, 13:12
von nemomuk
Vielen Dank ihr zwei!

Sehr nett von euch...

Verfasst: Samstag 8. Dezember 2007, 13:31
von nemomuk
spricht eigentlich etwas gegen diese Schreibweise ohne set? (Dann könnte ich nämlioch auch shuffle verwenden...

Code: Alles auswählen

farben = ["Eichel", "Gras", "Herz", "Schelln"]
werte = range(6, 11) + ['Sau', 'Ober', 'Unter']
kombiniert = []
for farbe in farben:
	for wert in werte:
		kombiniert.append([farbe,wert])
ty

Verfasst: Samstag 8. Dezember 2007, 15:23
von Leonidas
Es ist etwas langsamer und hmm, shuffle erledigt sich von selbst, da Sets ("Mengen") keine Ordnung besitzen.
Aber ansonsten kannst du auch Listen verwenden, ja.

Verfasst: Samstag 8. Dezember 2007, 15:26
von nemomuk
naja, aber für ein Kartenspiel ist shuffle eher besser als set... oder?

Verfasst: Samstag 8. Dezember 2007, 15:43
von Leonidas
Ja. Letztendlich funktionieren die ganzen Funktionen des Random-Moduls nicht mit Sets.

Verfasst: Samstag 8. Dezember 2007, 17:30
von nemomuk

Code: Alles auswählen

from Tkinter import *
import random

gui = Tk()

farben = ["Eichel", "Gras", "Herz", "Schelln"]
werte = range(6, 11) + ["Sau", "Ober", "Unter"]
kombiniert = []
for farbe in farben:
	for wert in werte:
		kombiniert.append([wert, farbe])
def mischen():
	random.shuffle(kombiniert)
	karten = []
	for wert,farbe in kombiniert:
		bild = PhotoImage(file="bilder/spielblatt/%s_%s.jpg" %(wert, farbe))
		karten.append(Label(gui,image=bild))
	return karten

karten = mischen()
for x in karten:
	x.pack()
gui.mainloop()
Ich frage mich nur, warum dann das hier jetzt nicht geht...

er sagt mir folgendes:

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Dokumente und Einstellungen\Besitzer\Desktop\Python\schafkopf\index.py", line 20, in <module>
    karten = mischen()
  File "D:\Dokumente und Einstellungen\Besitzer\Desktop\Python\schafkopf\index.py", line 16, in mischen
    bild = PhotoImage(file="bilder/spielblatt/%s_%s.jpg" %(wert, farbe))
  File "D:\Programme\Python\lib\lib-tk\Tkinter.py", line 3270, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "D:\Programme\Python\lib\lib-tk\Tkinter.py", line 3226, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: couldn't recognize data in image file "bilder/spielblatt/Sau_Gras.jpg"
Die Bilder existieren definitiv...

Verfasst: Samstag 8. Dezember 2007, 17:38
von Leonidas
Schon wieder Stern-Importe? Macht es Spaß die gut gemeinten Tipps der Leute hier zu ignorieren?

PhotoImage unterstützt keine JPEGs (first Google-hit btw), dazu brauchst du die PIL.

Verfasst: Samstag 8. Dezember 2007, 17:56
von nemomuk
Schon wieder Stern-Importe? Macht es Spaß die gut gemeinten Tipps der Leute hier zu ignorieren?
Nein?! Wo wurde mir das empfohlen?!

Danke!

Verfasst: Samstag 8. Dezember 2007, 18:00
von Leonidas
SchneiderWeisse hat geschrieben:
Schon wieder Stern-Importe? Macht es Spaß die gut gemeinten Tipps der Leute hier zu ignorieren?
Nein?! Wo wurde mir das empfohlen?!
Das wird hier normalerweise jedem gesagt, der Code mit Stern-Importen postet. Such mal nach "Stern-Import". Und guck auf [wiki]Import[/wiki].

Edit: Hab jetzt geschaut, du hast scheinbar echt noch kein Programm gepostet, welches Stern-Importe nutzt.

Verfasst: Samstag 8. Dezember 2007, 18:45
von nemomuk
ich habe jetzt versucht das Bild mit PIL zu öffnen und in Tkinter weiter zu verwenden...

Code: Alles auswählen

import Tkinter as tk
import Image
import ImageTk

gui = tk.Tk()
bild1 = Image.open("bilder/spielblatt/7_Herz.jpg")
bild = ImageTk.PhotoImage(bild1)
label = tk.Label(gui,image=bild)

label.tk.pack()
gui.mainloop()
Er sagt mir was von Attribute Error: pack

//Hab ich jetzt richtig importiert?^^