Variablen Namen in Schleife ansprechen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
BlackJack

Lösung: Variablennamen nicht durchnummerieren, sondern eine Liste verwenden.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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]
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:
    # ...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
BlackJack

Das Pythontutorial aus der Dokumentation. Oder jedes andere. Listen sind neben Dictionaries wirklich eine der grundlegensten Datenstrukturen in Python.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
BlackJack

Vor der Schleife erstellst Du eine leere Liste und in der Schleife kommen dort dann die ganzen `Label`-Objekte rein.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Vielen Dank ihr zwei!

Sehr nett von euch...
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

naja, aber für ein Kartenspiel ist shuffle eher besser als set... oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja. Letztendlich funktionieren die ganzen Funktionen des Random-Moduls nicht mit Sets.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Schon wieder Stern-Importe? Macht es Spaß die gut gemeinten Tipps der Leute hier zu ignorieren?
Nein?! Wo wurde mir das empfohlen?!

Danke!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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?^^
Antworten