WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   unset onkeydown for a key? (https://forum.worldviz.com/showthread.php?t=2575)

Josh 03-07-2010 01:57 PM

unset onkeydown for a key?
 
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:
Code:

viz.callback(viz.KEYDOWN_EVENT,None)
I guess you can also use:

Code:

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:

Code:

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:
Code:

.removeEvent
Deletes an EventFunction object

.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:
Code:

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. :-)


All times are GMT -7. The time now is 03:52 AM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC