Event einbauen?

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
ApertureScience
User
Beiträge: 4
Registriert: Sonntag 27. Januar 2013, 11:28

Hallo Leute. Ich habe gerade erst mit Python angefangen und habe
ein Problem, dass ich einfach nicht gelöst bekomme. :K
Für die meisten von euch dürfte das einfach sein. Ich will so eine art
Text-Adventure programmieren und habe das event "command" schon
mit def definiert. Nur kriege ich es nicht eingebaut. (Habs schon mit bind
probiert, irgendwie gehts nicht.)

Hier der Code:

Code: Alles auswählen

print ('You wake up. You find yourself in a room, that you have never seen.')
print ("You are confused and try to remember what happened, but you can't")
print ("remember anything. There is a door NORTH and a window SOUTH.")
print ('"What should I do?", you ask yourself. Well, that is YOUR desicion!')
print (' ')
print ('______________________________________________________________________')
print (' ')
def command (event):
    command = str(input('Command: '))
bind(command) #<- HIER WEIß ICH NICHT WEITER!
if command == ('go north'):
            print("I stand infront of the door...")
    

Bitte um Hilfe!
Zuletzt geändert von Anonymous am Sonntag 27. Januar 2013, 12:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Allein dass Du 'bind' und 'event' erwähnst lässt erahnen, was Du vielleicht vorhast. Dein Codebeispiel kann ich aber noch nicht wirklich verstehen...
Deine Funktion 'command' erwartet 'event' als Argument. Und dann?
'command' wiederum soll über 'bind' an etwas gebunden werden, nur an was?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@ApertureScience: Wo hast Du die Idee mit den Events denn her? In der Standardbibliothek gibt es (fast) nur die Tk-Anbindung, die auf ereignisbasierter Programmierung aufbaut. Das ist dann aber eine GUI und dort kann man mit ``print`` und `input()` für die Interaktion mit dem Benutzer nichts mehr anfangen.

Man braucht auch keine Ereignisbehandlung die eine Eingabe vom Benutzer abfragt, sondern der Benutzer gibt etwas ein, und *dafür* braucht man dann eine Ereignisbehandlung.

Wenn es eine textbasierte Anwendung sein soll, brauchst Du entweder ein Rahmenwerk, welches Dir so eine Ereignisbehandlung bietet, oder Du musst das selber schreiben. Oder Du programmierst das ganz normal als lineares Programm.

Weiter oben steht ja, dass es fast nur die Tk-Anbindung in der Standardbibliothek gibt, die ereignisbasierte Programmierung verwendet. Für interaktive, textbasierte Programme gibt es noch das `cmd`-Modul.

Ich denke übrigens generell, dass man bei ereignisbasierter Programmierung auch objektorientierte Programmierung drauf haben sollte. Sonst wird es schwierig die Zustände der einzelnen Programmkomponenten sauber zu verwalten.

Apropos `input()`: Entweder Du verwendest Python 3, dann ist der `str()`-Aufruf sinnfrei, oder Du verwendest Python 2, dann solltest Du aber die Finger von `input()` lassen und `raw_input()` verwenden.

Die Klammern um die Zeichenkette 'go north' machen keinen Sinn.

Wenn nichts ausgegeben werden soll, ausser dem impliziten Zeilenwechsel, dann braucht man ``print`` (oder auch `print()`) auch nichts zum Ausgeben angeben. Ein Leerzeichen sieht der Benutzer ja in aller Regel sowieso nicht.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@ApertureScience: BlackJack hat ja schon was zu Events geschrieben... Kann es sein, dass du "Events" im Sinne der Programmierung falsch verstehst?

Ein Event ist etwas, was "immer, überall und jederzeit" eintreten kann. Wenn du explizit auf _eine_ Sache wartest, dann ist es eigentlich kein echtes Event mehr.

Ein klassischens Beispiel für Events ist z.B. eine Webseite mit verschiedenen Eingabefeldern und Schaltflächen. Bei jedem / jeder kannst du per Javascript auf ein Event warten. In dem Fall weißt du halt vorher _nicht_ wann der Nutzer welches Event auslöst. Für sowas brauchst du dann wirklich ein Modul bzw. Programmiersprache (wie Javascript), welche(s) mit Events gut umgehen kann. Bei dir ist hingegegen ziemlich klar, wann das Prog auf etwas (=eine Eingabe) wartet.

Nach was anderes: Anstatt den Text mittels 'print' im Quellcode unterzubringen, solltest du den lieber extern auslagern. Das macht a) die Programmlogik wesentlich übersichtlicher und b) die Pflege des Texts wesentlich einfacher.

Gruß, noisefloor
Zuletzt geändert von noisefloor am Sonntag 27. Januar 2013, 14:26, insgesamt 1-mal geändert.
ApertureScience
User
Beiträge: 4
Registriert: Sonntag 27. Januar 2013, 11:28

@mutetella
Naja, ich habe ein Beispiel gesehen, das war aber mit dem einbinden von der wx library. Ich hab grade erst angefangen. Hast du eine Lösung?
Was ich will ist, dass ich von jeder beliebigen Codezeile auf das "command" zugreifen kann, damit ich nach jedem ausgegebenen Satz wieder etwas eingeben kann. :wink:
BlackJack

@ApertureScience: Vielleicht solltest Du mal ein Python-Tutorial mit den Grundlagen durcharbeiten, bevor Du versuchst beliebige Teile von einem GUI-Toolkit irgendwo zu integrieren wo das nicht geht und auch nicht viel Sinn macht. Warum hat noisefloor ja schon erklärt.

Was Du anscheinend suchst sind einfach nur Funktionen. Da Du welche verwendest, und das aber nicht siehst, scheinst Du die noch nicht verstanden zu haben. Deswegen der Hinweis auf eine Tutorial. In der Python-Dokumentation ist eines enthalten. Und Learn Python The Hard Way wird für Anfänger oft empfohlen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@ApertureScience
Ich denke auch, dass Du Dich mit dem, was hier bereits geschrieben wurde, auseinandersetzen und unbedingt die Grundlagen verinnerlichen solltest.

Es hat mich aber doch gereizt:

Code: Alles auswählen

class Event(object):
    def __init__(self):
        self.callbacks = set()

    def __call__(self, *args, **kwargs):
        for callback in self.callbacks:
            callback(*args, **kwargs)

    def add(self, listener):
        self.callbacks.add(listener)

    def remove(self, listener):
        self.callbacks.remove(listener)

class Player(object):
    def __init__(self, name):
        self.name = name

    def change_direction(self, direction):
        print '{0} now looks {1}wards'.format(self.name, direction)


def main_loop():
    player = Player('hubertus')
    events = {}
    for direction in ('north', 'east', 'south', 'west'):
        events[direction] = Event()
        events[direction].add(player.change_direction)
    while True:
        user_input = str(raw_input('north, east, south, west or quit $ '))
        if user_input == 'quit':
            break
        events[user_input](user_input)


if __name__ == '__main__':
    main_loop()

Code: Alles auswählen

>>> main_loop()
north, east, south, west or quit $ north
hubertus now looks northwards
north, east, south, west or quit $ west
hubertus now looks westwards
north, east, south, west or quit $ quit
>>>
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten