class ThunkEvent( QEvent ): """ A QEvent subclass that holds a callable which can be executed by its listeners. Sort of like a "queued connection" signal. """ EventType = QEvent.Type(QEvent.registerEventType()) def __init__(self, func, *args): QEvent.__init__(self, self.EventType) if len(args) > 0: self.thunk = partial(func, *args) else: self.thunk = func def __call__(self): self.thunk() @classmethod def post(cls, handlerObject, func, *args): e = ThunkEvent( func, *args ) QApplication.postEvent(handlerObject, e) @classmethod def send(cls, handlerObject, func, *args): e = ThunkEvent( func, *args ) QApplication.sendEvent(handlerObject, e)
class EventFlusher(QObject): SetEvent = QEvent.Type(QEvent.registerEventType()) def __init__(self, parent=None): QObject.__init__(self, parent) self._state = threading.Event() def event(self, e): if e.type() == EventFlusher.SetEvent: assert threading.current_thread().name == "MainThread" self.set() return True return False def eventFilter(self, watched, event): return self.event(event) def set(self): QApplication.sendPostedEvents() QApplication.processEvents() QApplication.flush() assert not self._state.is_set() self._state.set() def clear(self): self._state.clear() def wait(self): assert threading.current_thread().name != "MainThread" self._state.wait()
class CallbackEvent(QEvent): _evtype = QEvent.Type(QEvent.registerEventType()) def __init__(self, callback, *args): super(CallbackEvent, self).__init__(self._evtype) self.callback = callback self.args = args
def write(self, str): """ Emulate write function """ if self.guistream.thread() != QThread.currentThread(): sys_stdout.write(str) e = QEvent(QEvent.Type(RedirectionEventId)) e.txt = str QApplication.postEvent(self.guistream, e) pass else: self.guistream.write(str)
class Updater(): QUIT_EVENT_TYPE = QEvent.Type(QEvent.registerEventType()) def __init__(self, window): pass def checkForUpdates(self): pass def close(self): pass
class Updater(): QUIT_EVENT_TYPE = QEvent.Type(QEvent.registerEventType()) # https://github.com/vslavik/winsparkle/wiki/Basic-Setup def __init__(self, window): try: sys.frozen # don't want to try updating python.exe self.updater = ctypes.cdll.WinSparkle self.updater.win_sparkle_set_appcast_url( 'http://eliteocr.sourceforge.net/appcast.xml' ) # py2exe won't let us embed this in resources self.updater.win_sparkle_set_automatic_check_for_updates(1) self.updater.win_sparkle_set_update_check_interval(47 * 60 * 60) # set up shutdown callback global mainwindow mainwindow = window self.callback_t = ctypes.CFUNCTYPE(None) # keep reference self.callback_fn = self.callback_t(shutdown_request) self.updater.win_sparkle_set_shutdown_request_callback( self.callback_fn) self.updater.win_sparkle_init() except: from traceback import print_exc print_exc() self.updater = None def checkForUpdates(self): if self.updater: self.updater.win_sparkle_check_update_with_ui() def close(self): if self.updater: self.updater.win_sparkle_cleanup() self.updater = None
class Updater(): QUIT_EVENT_TYPE = QEvent.Type(QEvent.registerEventType()) # http://sparkle-project.org/documentation/customization/ def __init__(self, window): try: objc.loadBundle( 'Sparkle', globals(), join(dirname(sys.executable), os.pardir, 'Frameworks', 'Sparkle.framework')) self.updater = SUUpdater.sharedUpdater() except: # can't load framework - not frozen or not included in app bundle? self.updater = None def checkForUpdates(self): if self.updater: self.updater.checkForUpdates_(None) def close(self): self.updater = None
class FinishImageGrowthEvent(QEvent): def __init__(self): QEvent.__init__(self, FinishImageGrowthEvent.event_type) event_type = QEvent.Type(QEvent.registerEventType())
class UpdateNbImageEvent(QEvent): def __init__(self, nb): QEvent.__init__(self, self.event_type) self.nb = nb event_type = QEvent.Type(QEvent.registerEventType())
class ImageReadyPlottingEvent(QEvent): def __init__(self): QEvent.__init__(self, self.event_type) event_type = QEvent.Type(QEvent.registerEventType())
class FinishLoadingEvent(QEvent): def __init__(self): QEvent.__init__(self, self.event_type) event_type = QEvent.Type(QEvent.registerEventType())
class AbortPlottingEvent(QEvent): def __init__(self, reason): QEvent.__init__(self, self.event_type) self.reason = reason event_type = QEvent.Type(QEvent.registerEventType())
class NextImageEvent(QEvent): def __init__(self): QEvent.__init__(self, self.event_type) event_type = QEvent.Type(QEvent.registerEventType())
class ScaleEvent(QEvent): Type = QEvent.Type(QEvent.registerEventType()) def __init__(self, config): QEvent.__init__(self, 11003) self.config = config