Liste sysimatisch durchgehen?

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.
Antworten
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
Zuletzt geändert von Hyperion am Dienstag 16. Februar 2010, 15:54, insgesamt 2-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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:

Code: Alles auswählen

for menu_name in menu_list:
    ...
Was steht jetzt bei jedem Schleifendurchlauf in menu_name?
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

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?^^
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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 [...]".
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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()
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

muss ich irgendwelche Bibliotheken importieren? kriege nämlich eine Syntaxerror!

(Sorry wenn ich mich dämlich anstelle, habt mit mir Geduld. :oops: )
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

/me hat ja gesagt dass es PseudoCode ist!
the more they change the more they stay the same
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

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]
Zuletzt geändert von Mr.Wolna am Dienstag 16. Februar 2010, 17:00, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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. :oops: )
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.
Mr.Wolna
User
Beiträge: 93
Registriert: Dienstag 6. Oktober 2009, 17:43

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)
Antworten