Variablenname -> String

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
Maurice

Hi,

im Modul pygame gibt es Konstanten (integer), welche die Event-Typen darstellen, also zb. pygame.QUIT, pygame.MOUSEBUTTONDOWN usw.

Wenn jetzt so ein Event ankommt, würde ich gerne aus dieser Konstante einen String machen, sprich wenn event == pygame.QUIT, dann string_event = "pygame.QUIT" oder "QUIT".

Irgendwie sagt mir mein Verstand, dass das so nicht funktioniert, da in event ja nicht die Bezeichnung, sondern nur der Integer steht. Oder irre ich mich da?

Wie könnte man sowas elegant lösen, ich möchte auf eine Reihe if-Abfragen verzichten.

Danke
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Maurice hat geschrieben:Wie könnte man sowas elegant lösen, ich möchte auf eine Reihe if-Abfragen verzichten.
Am ehesten wohl mit einem Dictionary:

pygameDict = { pygame.QUIT : "QUIT" , pygame.MOUSEBUTTONDOWN : "MOUSEBUTTONDOWN" }
...
string_event = pygameDict[event]


Jan
maurice
User
Beiträge: 4
Registriert: Donnerstag 20. November 2003, 20:24

Danke, so hab ichs jetzt gemacht.

Hab mir überlegt ob man nicht vielleicht direkt im pygame-Modul suchen könnte, quasi als dict-Ersatz, dort stehen ja die Bezeichnungen drin. Aber das wär jetzt nur spielerei.
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
maurice hat geschrieben:Hab mir überlegt ob man nicht vielleicht direkt im pygame-Modul suchen könnte, quasi als dict-Ersatz, dort stehen ja die Bezeichnungen drin.
Ja, das bekäme man vielleicht hin, und zwar mit Buildin-Funktionen dir() und getattr(). Allerdings sind die Events irgendwie nicht einheitlich benannt, so dass man sie nicht so einfach von den anderen Attributen unterscheiden kann.

Code: Alles auswählen

>>> dir(pygame)
['ACTIVEEVENT', 'ANYFORMAT', 'ASYNCBLIT', 'AUDIO_S16', 'AUDIO_S16LSB', 'AUDIO_S16MSB', 'AUDIO_S16SYS', 'AUDIO_S8', 'AUDIO_U16', 'AUDIO_U16LSB', 'AUDIO_U16MSB', 'AUDIO_U16SYS', 'AUDIO_U8', 'Color', 'DOUBLEBUF', 'FULLSCREEN', 'GL_ACCUM_ALPHA_SIZE', 'GL_ACCUM_BLUE_SIZE', ...
>>> getattr(pygame,'K_TAB')
9
Beides zusammen:

Code: Alles auswählen

>>> [(attr,getattr(pygame,attr)) for attr in dir(pygame) if attr.startswith("K_")]
[('K_0', 48), ('K_1', 49), ('K_2', 50), ('K_3', 51), ('K_4', 52), ('K_5', 53), ('K_6', 54), ('K_7', 55), ('K_8', 56), ('K_9', 57), ('K_AMPERSAND', 38), ('K_ASTERISK', 42), ('K_AT', 64), ('K_BACKQUOTE', 96), ('K_BACKSLASH', 92), ('K_BACKSPACE', 8), ('K_BREAK', 318), ('K_CAPSLOCK', 301), ('K_CARET', 94), ('K_CLEAR', 12), ('K_COLON', 58), ('K_COMMA', 44), ('K_DELETE', 127), ('K_DOLLAR', 36), ('K_DOWN', 274), ('K_END', 279), ('K_EQUALS', 61), ('K_ESCAPE', 27), ('K_EURO', ...
Jan
maurice
User
Beiträge: 4
Registriert: Donnerstag 20. November 2003, 20:24

Danke nochmal, hätte damit jetzt schonmal alle Namen der Konstanten mit dem selben Wert bekommen (wären allerdings mehr als eine).

Aber, beim rumspielen mit dir(pygame) bin ich auf pygame.event.event_name() gestoßen.
Das ist genau was ich gesucht hab, hätte mal gleich genauer in der Dokumentation gucken sollen :)
Antworten