Seite 1 von 1
Liste sysimatisch durchgehen?
Verfasst: Dienstag 16. Februar 2010, 14:59
von Mr.Wolna
Moin, also ich habe jetzt meine Umgebung mit dazugehörigen Tools und Plugins soweit hergestellt, und nur versuche ich mich mehr oder weniger erfolgreich an den Grundlagen und wühle mich durch diverses Tutorial Material.
Folgendes Problem, zwar mit einem auf pygame basierten Code, aber schließlich gehst hier um die Grundlagen.
Code: Alles auswählen
#! /usr/bin/env python
# -*- coding: cp1252 -*-
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((640, 480)) #setzt display
menupoint = MP = ["Neues Spiel", "Fortsetzen", "Optionen", "Credits", "Beenden"]
font = pygame.font.Font("font.ttf", 30) #font(aus datei) und schriftgröße
name = font.render(MP[0], 1, (255, 255, 255)) #name, antilas, farbe
#screen.blit(name, (450, 300)) #zeichnet an gewünschter position
#screen.blit(name, (450, 300))
while True:
pygame.display.update()
for event in pygame.event.get():
keyinput = pygame.key.get_pressed()
#mouseinput = pygame.mouse.get.pressed()
if event.type == QUIT:
pygame.quit()
if keyinput[pygame.K_ESCAPE]:
pygame.quit()
if keyinput[pygame.K_DOWN]:
for x in MP:
name = font.render(MP [int(x)], 1, (255, 255, 255))
screen.blit(name, (450, 300)) #mp liste um 1 erhöhen
#MP = [1]
print"Down"
if keyinput[pygame.K_UP]:
screen.blit(name, (450, 300))
print"Up"
Folgender Fehler, beim drücken der Arrow Down Taste.
name = font.render(MP [int(x)], 1, (255, 255, 255))
ValueError: invalid literal for int() with base 10: 'Neues Spiel'
Was ich versuche ist eigentlich ganz simple.
Bei jedem Up/Down soll er die Liste runter bzw. hoch arbeiten, und den Output auf dem Bildschirm ausgeben.
Hoffe jemand hat mehr Ahnung^^
MfG,
Mr.Wolna
edit:
Ich will halt den Listenindex mit jedem _K.UP bzw DOWN runter/hochsetzen.
Verfasst: Dienstag 16. Februar 2010, 15:28
von Hyperion
Du iterierst über eine Liste mit Strings und wunderst Dich, dass die Funktion int() diese nicht umwandeln kann...
Für den Index einer Liste gibt es enumerate()!
Aber mal ehrlich: Ohne diesen pygame-Geraffel und mit einer einfachen ipython Shell könnte man das leicht selber rausfinden und ausprobieren

Re: Liste sysimatisch durchgehen?
Verfasst: Dienstag 16. Februar 2010, 15:34
von /me
Die Fehlerbeschreibung ist eigentlich eindeutig. An der Stelle wo du versuchst den String x in einen Integer-Wert zu verwandeln enthält x keinen Inhalt der sich in ein Integer verwandeln ließe sondern den Wert "Neues Spiel". Schau dir die Fehlermeldung noch mal an und verstehe sie.
Jetzt kommen wir zu der Frage was du da eigentlich machen möchtest. Anscheinend möchtest du via MP[int(x)] den Menütext holen. Nun gehst du aber her und hast diesen Code in einer Schleife der Form
for x in MP. Nimm mal sinnvollere Namen und du merkst was da passiert. Ein Beispiel könnte so aussehen:
Was steht jetzt bei jedem Schleifendurchlauf in menu_name?
Verfasst: Dienstag 16. Februar 2010, 16:05
von Mr.Wolna
Ok, ich verstehe nicht ganz.
Mal ne Frage, könntet ihr mir ein schnippet Posten, das ohne den ganzen pygame Quatsch folgendes macht.
Mit jedem Tastendruck (nach unten) wird ein Element einer liste geprintet z.B:
liste = ["1", "2", "3", "4", "5"]
wenn taste*** gedrückt wird dann:
for item in liste
print item
erhöhe item um eins.
edit:
wenn ich das for in für meine liste verwende, printet er untereinander alle Menüpunkte, ich will aber das er nacheinander, nach jedem Druck auf die taste das weitere item ausgibt.
edit2: hm, villeicht sollte ich es mit while versuchen?^^
Verfasst: Dienstag 16. Februar 2010, 16:14
von /me
Mr.Wolna hat geschrieben:Mit jedem Tastendruck (nach unten) wird ein Element einer liste geprintet z.B:
liste = ["1", "2", "3", "4", "5"]
wenn taste*** gedrückt wird dann:
for item in liste
print item
erhöhe item um eins.
Warum probierst du das nicht schnell selber aus? Aber gut, da ist der Code:
Code: Alles auswählen
liste = ["1", "2", "3", "4", "5"]
for item in liste:
print item
Den Tastendruck habe ich mir mal geschenkt, das hängt jetzt wirklich von der Umgebung ab.
Deine Beschreibung und dein Beispiel(pseudo)code widersprechen sich übrigens. Willst du jetzt ein einziges Element schreiben oder alle? Vom Code her sind es alle, sonst bräuchtest du die for-Schleife ja nicht, aber im Text schreibst du "[...] wird ein Element [...]".
Verfasst: Dienstag 16. Februar 2010, 16:22
von /me
Mr.Wolna hat geschrieben:
edit:
wenn ich das for in für meine liste verwende, printet er untereinander alle Menüpunkte, ich will aber das er nacheinander, nach jedem Druck auf die taste das weitere item ausgibt.
Pseudocode:
Code: Alles auswählen
liste = ["a", "b", "c", "d"]
aktueller_menüeintrag = 0
print liste[aktueller_menüeintrag]
[...]
def nächsten_menüeintrag_anzeigen():
[... hier Fehlerprüfung ergänzen um festzustellen ob das Ende erreicht wurde ...]
aktueller_menüeintrag += 1
print liste[aktueller_menüeintrag]
[... die große Hauptschleife]
if taste_gedrückt:
nächsten_menüeintrag_anzeigen()
Verfasst: Dienstag 16. Februar 2010, 16:35
von Mr.Wolna
muss ich irgendwelche Bibliotheken importieren? kriege nämlich eine Syntaxerror!
(Sorry wenn ich mich dämlich anstelle, habt mit mir Geduld.

)
Verfasst: Dienstag 16. Februar 2010, 16:37
von Dav1d
/me hat ja gesagt dass es PseudoCode ist!
Verfasst: Dienstag 16. Februar 2010, 16:44
von Mr.Wolna
jo ich uniwssender kömpfe mich grade durch. leider muss ich jetz nach einen API WIN Wrapper Suchen, oder gibt es eine input lib im standart python? ich könnte natürlich auch weiter pygame benutzen, aber ich will es übersichtlich haben um die struktur zu verstehen.
edit; Jawohl! Danke Euch. Ich kann jetz durhc das Menü scrollen, mal sehen, wie ich weiter vorgehe. Ich melde mich, wenn es Probleme wider geben sollte.
edit:
Jo also mit diesen Code, geht er zwar durch die Liste, aber bappt immer ein blit auf ein anderes -.- Das heißt ich muss es irgendwie löschen. Bzw. nur die variable ändern und nicht jedes mal einen neuen blit erstellen.
Aber die Mechanik dahinter ist mir jetzt klar geworden, Danke Euch dafür!
Code: Alles auswählen
#! /usr/bin/env python
# -*- coding: cp1252 -*-
import pygame
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((640, 480))
list = ["Neues Spiel", "Fortsetzen", "Optionen", "Credits", "Beenden"]
item = 0
font = pygame.font.Font("font.ttf", 30) #
name = font.render(list[item], 1, (255, 255, 255))
screen.blit(name, (450, 300))
while True:
pygame.display.update()
for event in pygame.event.get():
keyinput = pygame.key.get_pressed()
#mouseinput = pygame.mouse.get.pressed()
if event.type == QUIT:
pygame.quit()
if keyinput[pygame.K_ESCAPE]:
pygame.quit()
if keyinput[pygame.K_DOWN]:
item +=1
name = font.render(list[item], 1, (255, 255, 255))
screen.blit(name, (450, 300))
print list[item]
#print"Down"
if keyinput[pygame.K_UP]:
print"Up"
#print list[item]
Verfasst: Dienstag 16. Februar 2010, 16:59
von /me
Mr.Wolna hat geschrieben:muss ich irgendwelche Bibliotheken importieren? kriege nämlich eine Syntaxerror!
(Sorry wenn ich mich dämlich anstelle, habt mit mir Geduld.

)
Dann tu dir und uns den Gefallen und arbeite das
Python-Tutorial durch.
Selbst wenn ich nicht dazugeschrieben hätte, dass es sich hier um Pseudocode handelt hätte man das mit elementarstem Grundwissen eigentlich sofort erkennen müssen.
Verfasst: Dienstag 16. Februar 2010, 17:15
von Mr.Wolna
noch einmal ich arbeite dieses Tutorial schon seit dem ersten mal als ich den Link bekommen habe durch.
Zum Code, ich hätte genauer hinschauen müssen, das stimmt^^ (mittlerweile hab ich es ja auch hingekriegt)