From: Kevin A. <al...@se...> - 2004-09-27 19:25:17
|
On Sep 27, 2004, at 11:18 AM, Heimburger, Ralph P wrote: > I know there is a timer example in the PythonCard sample applications > but I would like to know if anyone has implemented an inactivity > timeout: If a user does not press a key or click within PythonCard app > for a period of time, it will issue a self.Close(). > The jabberChat sample has a simplistic implementation based on just checking whether the mouse has moved, so take a look at that. There was a question about something like this on the wxPython-users mailing list, so you might want to ask there as well. I think the person on wxPython-users was looking for a way of tapping into operating system APIs that showed overall system inactivity and wasn't specific to just their application. The problem is that once your application is deactivated by the user switching to another application or minimizing your application you won't know if the user is actually active or not on the system. The global mouse position is a rough hack, but it obviously doesn't catch the case of the keyboard intensive user that avoids the mouse. If the application is active and the cursor is in an editable field you should see idle events as the event queue empties; idle in wxPython and PythonCard terms simply means that the event queue just emptied, it does not mean the system is actually idle, which is one reason I've considered changing the event name. But you'll want to be more specific than that. To check for the user being idle in your application you want to check for key presses as well as mouse movement or mouse presses. Assuming you don't have any component-specific handlers for mouseDown or keyDown, you might add some handlers in addition to the the check for mouse movement such as: def on_keyDown(self, event): self.userIsIdle = False event.skip() def on_mouseDown(self, event): self.userIsIdle = False event.skip() Then you'll also want a timer handler that runs every second, that saves the current time when userIdle is False. When userIsIdle is True and your specified amount of time has passed then you can call self.close(). Something like: if not self.userIdle: self.lastTimeUserNotIdle = time.time() else: if time.time() - self.lastTimeUserNotIdle > self.idleTimeout: # idleTimeout should be specified in seconds self.close() I didn't test the code, but that's the general idea. You still need to check whether the mouse has moved globally in your timer handler rather than in a mouseMove handler because you won't get a mouseMove unless it is over one of your components, so just borrow that code from jabberChat. ka |