From: pin Date: Mon, 17 May 2010 14:09:33 +0000 (+0000) Subject: Clignotement du curseur basé sur un thread indépendant de pygame. X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/commitdiff_plain/90331dd4caff60e9517c862101a37d1ae4ee00d1?hp=d2d0e07ee1695d69a6954133c7997974b55c62c8 Clignotement du curseur basé sur un thread indépendant de pygame. Bugfix. git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@166 fe552daf-6dbe-4428-90eb-1537e0879342 --- diff --git a/src/app/events.py b/src/app/events.py index 6b90d92..a67a416 100755 --- a/src/app/events.py +++ b/src/app/events.py @@ -1,8 +1,7 @@ import pygame from sys import modules -events = ['TIMEOUT', - 'NOTEON', +events = ['NOTEON', 'NOTEOFF', 'NOTEEND', 'COLDOWN', @@ -14,7 +13,7 @@ eventNames = {} self = modules[__name__] for i, name in enumerate(events) : - eventType = pygame.USEREVENT+i + eventType = pygame.USEREVENT + 1 + i eventNames[eventType] = name setattr(self, name, eventType) diff --git a/src/app/log.py b/src/app/log.py index 3cffbb3..abbb858 100755 --- a/src/app/log.py +++ b/src/app/log.py @@ -6,7 +6,7 @@ $Id$ $URL$ """ -from events import TIMEOUT, COLOVER, eventNames +from events import COLOVER, eventNames from event_pprinters import pprinters import sys import pygame @@ -18,7 +18,6 @@ LOG_FORMAT_VERSION='1.0' hiddenEvents = {pygame.MOUSEMOTION:True, pygame.MOUSEBUTTONDOWN:True, pygame.MOUSEBUTTONUP:True, - TIMEOUT:True, #COLOVER:True, } diff --git a/src/app/logfilereader.py b/src/app/logfilereader.py index f5f5d54..64711c1 100755 --- a/src/app/logfilereader.py +++ b/src/app/logfilereader.py @@ -209,4 +209,6 @@ class LogFilePlayer(PlayingScreenBase) : previousTicks = ticks + self.stop() + \ No newline at end of file diff --git a/src/app/widgets/cursors.py b/src/app/widgets/cursors.py index 1e3fc4e..c8df104 100755 --- a/src/app/widgets/cursors.py +++ b/src/app/widgets/cursors.py @@ -8,8 +8,9 @@ $URL$ import pygame import os +from threading import Thread +import time from eventutils import EventHandlerMixin, event_handler -from events import TIMEOUT from itertools import cycle class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): @@ -60,22 +61,27 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): self.blinkMode = blinkMode self._startBlink() + def __del__(self) : + if hasattr(self, 'timer') : + try : self.timer.stop() + except : pass + def _startBlink(self) : if self.blinkMode : self._blinking = True - pygame.time.set_timer(TIMEOUT, self.duration) self.iterator = self.iterImages() + self.timer = ForeverTimer(self.duration, self.loadNext) + self.timer.start() def _stopBlink(self) : if self.blinkMode : - pygame.time.set_timer(TIMEOUT, 0) + self.timer.stop() def iterImages(self) : for img in cycle(self.images) : yield img - @event_handler(TIMEOUT) - def loadNext(self, event) : + def loadNext(self) : if self._blinking : self.dirty = 1 self.image = self.iterator.next() @@ -91,7 +97,6 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): self.dirty = 1 if self.blinkMode : self._blinking = True - self.loadNext(event) else : self.image = self.images[0] @@ -105,3 +110,21 @@ class WarpingCursor(pygame.sprite.DirtySprite, EventHandlerMixin): x, y = pos rx, ry = self.rect.centerx, self.rect.centery self.rect.move_ip(x-rx, y-ry) + + +class ForeverTimer(Thread) : + def __init__(self, duration, func, *args, **kw) : + Thread.__init__(self) + self.duration = duration / 1000. + self.func = func + self.args = args + self.kw = kw + self.running = True + + def run(self) : + while self.running : + self.func(*self.args, **self.kw) + time.sleep(self.duration) + + def stop(self) : + self.running = False \ No newline at end of file diff --git a/src/app/widgets/playingscreen.py b/src/app/widgets/playingscreen.py index 67039e7..75f68fd 100755 --- a/src/app/widgets/playingscreen.py +++ b/src/app/widgets/playingscreen.py @@ -88,7 +88,7 @@ class PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) : EventDispatcher.dispatchEvents() dirty = self.draw(pygame.display.get_surface()) pygame.display.update(dirty) - clock.tick() + clock.tick(FRAMERATE) def stop(self) : self._running = False