mabue88
Goto Top

Python: wie programmiere ich eventbasiert?

Hallo,

bisher habe ich in Python immer ohne Events programmiert. Aus C# kenne ich die eventbasierte Programmierung. Dank Visual Studio lassen sich die Eventhandler schließlich schnell und einfach automatisch erstellen.

Nun würde ich aber gerne in Python gerne mit Events arbeiten. Entweder benutze ich die falschen Suchbegriffe, oder ich steige in Python einfach nicht so richtig dahinter. Im Netz konnte ich bislang nichts finden, mit dem ich in das Thema einsteigen konnte.

Als Beispeil mal folgender Code:

#!/usr/bin/python

from thread import start_new_thread
from time import sleep

class EventExampleClass():
    def __init__(self, seconds):
        start_new_thread(self.timer_thread, (seconds,))
        
    def timer_thread(self, seconds):
        sleep(seconds)
        print "Der Timer ist abgelaufen"  


if __name__ == "__main__":  
    print "Der Timer wird gestartet"  
    eec = EventExampleClass(3)

    while True:
        pass

Mit dem Initialisieren der Klasse EventExampleClass wird ein Thread gestartet, der nach der angebenen Anzahl von Sekunden "Der Timer ist beendet" auf dem Bildschirm ausgibt.

Im Prinzip will ich, dass zwischen den Zeilen "sleep(seconds)" und "print 'Der Timer ist abgelaufen'" ein Event ausgelöst wird, auf das ich in der Main reagieren kann.

Ich für alle Tipps und Tricks dankbar!

Gruss
mabue

Content-Key: 222498

Url: https://administrator.de/contentid/222498

Printed on: April 18, 2024 at 11:04 o'clock

Member: mabue88
mabue88 Nov 20, 2013 at 12:58:29 (UTC)
Goto Top
Ich habe doch noch was gefunden:

http://www.valuedlessons.com/2008/04/events-in-python.html

Das Programm könnte dann so aussehen:
#!/usr/bin/python

from thread import start_new_thread;
from time import sleep;

class Event:
    def __init__(self):
        self.handlers = set()

    def handle(self, handler):
        self.handlers.add(handler)
        return self

    def unhandle(self, handler):
        try:
            self.handlers.remove(handler)
        except:
            raise ValueError("Handler is not handling this event, so cannot unhandle it.")  
        return self

    def fire(self, *args, **kargs):
        for handler in self.handlers:
            handler(*args, **kargs)

    def getHandlerCount(self):
        return len(self.handlers)

    __iadd__ = handle
    __isub__ = unhandle
    __call__ = fire
    __len__  = getHandlerCount
    
class EventExampleClass():
    def __init__(self, seconds):
        self.timer_tick = Event();
        start_new_thread(self.timer_thread, (seconds,));
        
    def timer_thread(self, seconds):
        sleep(seconds);
        self.timer_tick("Der Timer wurde beendet");  

def timer_event(message):
    print message;

  
if __name__ == "__main__":  
    eec = EventExampleClass(3);
    eec.timer_tick += timer_event;

    while True:
        pass;