slider erzeugt 3 events

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
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Hi Alle,

ich habe ein Slider Element, welches gleich 3 Events erzeugt. Jedes Event stößt eine CPU- lastige Prozedur an. Zur Zeit fehlt mir die perfekte Idee/Lösung.

Hat da Jemand vielleicht einen guten Vorschlag für mich ?

Meine Idee ist einen Zeitstempel zu setzen und dann 0.2 Sek. zu warten. Ist die Differenez dann zwischen Zeitstempel und vergangener Zeit mindestens 0.2 Sek. so wird die Prozedur ausgeführt.

Eine weitere Idee wäre meine aufzurufende Methode zu sperren.

Grüße Markus
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

feldmann_markus hat geschrieben:Meine Idee ist einen Zeitstempel zu setzen und dann 0.2 Sek. zu warten. Ist die Differenez dann zwischen Zeitstempel und vergangener Zeit mindestens 0.2 Sek. so wird die Prozedur ausgeführt.
Ja. So ähnlich hätte ich das auch gemacht. D.h in GTK+ hätte ich ein ``timeout_add`` gemacht, mit etwas Wartezeit und bei jedem neuen Event dann diesen Timeout gelöscht und neu gesetzt. So dass nach der Wartezeit die Funktion automatisch startet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Irgendwie will er nicht so wie ich will. :-)

http://pastebin.com/m423f419e

Anscheinend kann er nicht 2 Verbindungen mit einem Event gleichzeitig aufbauen oder ?

Ausspucken tut er mir dann nur,
last slider event was 1245580374.68
last slider event was 1245580381.33
last slider event was 1245580385.76
last slider event was 1245580388.82

Also führt er meine sliderHandler() Methode nicht aus. Für die obige Ausgabe wurde der Slider 4 mal betätigt.

Noch besser wäre es, wenn ein Mouse event mit einem Slider Event kombiniert würde. Also wenn es ein slider event gibt, dann soll, nach dem der Maus Button los gelassen wurde, der Wert des sliders ausgelesen werden.

Wie kann ich 2 mal bind() mit einem event machen ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nein, ``sleep()`` geht ja mal gar nicht, da friert die GUI ein und es passiert garnix. Such mal ob wx soetwas bietet wie ``timeout_add()`` mit dem du den Funktionaufruf um einen bestimmten Zeitraum versehen kannst.

So schwer ist das gar nicht, hier ein Beispiel mit PyGTK.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

sleep habe ich raus genommen. Es gibt wxTimer welcher glaube ich so eine Art Countdowntimer darstellt. Was macht timeout_add() genau ? Es gibt auch wxTimer.Notify(), allerdings weiß ich nicht genau was diese Methode macht. Es gibt auch noch wxStopWatch

http://docs.wxwidgets.org/stable/wx_wxt ... ml#wxtimer.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``timeout_add`` führt eine Funktion (in dem Fall ``do_work()``) nach einer bestimmten Anzahl von Millisekunden (hier 200) aus, und gibt eine ID zurück, mit der man den Callback wieder löschen kann (``source_remove``) falls zwischendrin der Slider nochmal verschoben wurde.

Damit gehe ich also sicher, dass der Aufruf von ``do_work`` frühestens nach 0.2 Sekunden ab dem verschieben des Sliders stattfindet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Danke für die gute Idee Leonidas, ich habe einen anderen simplen und Ressourcen schonenden Weg eingeschlagen. Es wird zu Anfang ein Zeitstempel erstellt und auf 0 gestellt. Ach am besten zeige ich die Methode,

Code: Alles auswählen

    def sliderHandler(self, evt):
        value = self.slider.GetValue()
#         print "slider value ist ",value
        if time.time() >= (self.lastsliderevent + 0.2):
            value = int(evt.GetInt() / 1000.)
            self.sliderText.SetValue('%g'%value)
            self.slider.SetValue(value*1000)
            self.parent.setKnob(value)
            self.lastsliderevent = time.time()
#             print "slider value wurde auf den wert ",value," gesetzt."
            self.lastvalue = value
        else:            
            self.sliderText.SetValue('%g'%self.lastvalue)
            self.slider.SetValue(self.lastvalue*1000)
Damit gehe ich sicher das immer nur ein Event alle 0.2 Sek. meine Grafik neu zeichnet. In dem else Teil setze ich den slider auf den letzten Wert, falls der event zu schnell rein kam, ansonsten würde der slider was anderes als meine Grafik anzeigen. Für meine Zwecke reicht das

Grüße Markus
Antworten