PDA

View Full Version : unset onkeydown for a key?


Josh
03-07-2010, 01:57 PM
Hi all

Is there a way to unset the onkeydown for a key once you already assigned it an action?

Thanks
Josh

IGoudt
03-07-2010, 10:16 PM
You can use:
viz.callback(viz.KEYDOWN_EVENT,None)

I guess you can also use:

vizact.onkeydown(key, None)

Depending if you use vizact or viz.callback to handle your events.

Josh
03-08-2010, 02:37 AM
Thanks so far...

The space bar should only be pressed once in my experiment:

vizact.onkeydown(' ', play_first_joke)

As soon as it's been pressed, it shouldn't invode the play_first_joke method anymore.

vizact.onkeydown(' ', None)

...gives the following error:

Traceback (most recent call last):
File "C:\Programme\WorldViz\Vizard30\python\vizact.py", line 3019, in __onkeydown
self._callGroup(self.__keydownmap[key])
File "C:\Programme\WorldViz\Vizard30\python\vizact.py", line 2971, in _callGroup
val = e.call(arg)
File "C:\Programme\WorldViz\Vizard30\python\vizact.py", line 2794, in _callStatic
return func(*args,**kwargs)
TypeError: 'NoneType' object is not callable

IGoudt
03-08-2010, 04:01 AM
After searching in the documentation I found the following:

<vizact>.removeEvent
Deletes an EventFunction object

<vizact>.removeEvent( eventFunctionObj )

eventFunctionObj

Remarks

Uses this when you no longer need an EventFunction callback.

Return Value

None

Example

eventFunction = vizact.onupdate( 5, doSomething )
...
vizact.removeEvent( eventFunction )

Josh
03-08-2010, 04:03 AM
Thank you. But I don't know how exactly I can use this now... I'm sorry, I'm absolutely new to Python and to the theories that stand behind events in WorldViz...

IGoudt
03-08-2010, 04:24 AM
Whenever you register a function with vizact.onkeydown a reference is made in memory between the keystroke and the function. What you wish to achieve is to break that reference. A way to do that, have your program memorize that reference as a variable and then do some operation on that variable, in this case: removeEvent.

Take for example:

def initialiseProgram():
playJokeEvent = vizact.onkeydown(' ', play_first_joke)
... other initialisation

def play_first_joke():
vizact.removeEvent(playJokeEvent)
.. do your fancy scene stuff here

I have to admit that I am used to program OOP in classes, and the handling of variables is different when using classes in python than when using direct code (self, vs, global). Try this code snippet first, if it doesn't work out well then we might to do some hacking with the [global] statement.

Josh
03-08-2010, 12:49 PM
Thanks, that helps a lot. :-)