2015-09-05 4 views
1

Я пытаюсь написать базовую программу с использованием прыжкового движения, я просто хочу постоянно запускать метод on_frame, но метод работает только один раз, и отключение устройства не вызывает метод on_disconnect. Программа не будет работать до тех пор, пока я не нажму «Enter», «Что я делаю неправильно? Спасибо за помощь:Проблема с использованием Leap motion и python

import Leap, sys, thread 
from Leap import CircleGesture, KeyTapGesture, ScreenTapGesture,SwipeGesture 

class LeapMotionListener(Leap.Listener): 
    state_names = ["STATE_INVAILD","STATE_START","STATE_UPDATE", "STATE_END"] 

    def on_init(self, controller): 
     print "Initialized" 
    def on_connect(self, controller): 
     print "Connected" 

     controller.enable_gesture(Leap.Gesture.TYPE_CIRCLE); 
     controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP); 
     controller.enable_gesture(Leap.Gesture.TYPE_SCREEN_TAP); 
     controller.enable_gesture(Leap.Gesture.TYPE_SWIPE); 
     print "All gestures enabled" 
    def on_disconnect(self, controller): 
     print "Disconnected" 
    def on_exit(self, controller): 
     print "Exit" 
    def on_frame(self, controller): 
     frame= controller.frame() 
     print "\n Frame ID"+ str(frame.id) 
     print "num of hands: " +str(len(frame.hands)) 
     print "num of gestures: " +str(len(frame.gestures())) 
     for gesture in frame.gestures(): 
      if gesture.type is Leap.Gesture.TYPE_CIRCLE: 
       circle = Leap.CircleGesture(gesture) 
      elif gesture.type is Leap.Gesture.TYPE_SWIPE: 
       swipe = Leap.SwipeGesture(gesture) 
      elif gesture.type is Leap.Gesture.TYPE_KEY_TAP: 
       key_tap = Leap.KeyTapGesture(gesture) 
      elif gesture.type is Leap.Gesture.TYPE_SCREEN_TAP: 
       screen_tap = Leap.ScreenTapGesture(gesture) 

def main(): 
    listener= LeapMotionListener() 
    controller = Leap.Controller() 
    controller.add_listener(listener) 

    print "Press enter to quit: " 

    try: 
     sys.stdin.readline() 
    except KeyboardInterrupt: 
     pass   
    finally: 
     controller.remove_listener(listener) 

if __name__ == "__main__": 
    main() 

ответ

0

Ваш код отлично работает из командной строки. I.e:

> python scriptname.py 

Вы бежите от Idle? если да, то эта часть:

try: 
    sys.stdin.readline() 
except KeyboardInterrupt: 
    pass 

не работает. (См. Python 3.2 Idle vs terminal) Аналогичная проблема может возникнуть в других IDE.

Следующее должно работать в режиме ожидания, но вы должны использовать Ctrl-C для выхода.

# Keep this process running until a Ctrl-C is pressed 
print "Press Ctrl-C to quit..." 

try: 
    while True: 
     time.sleep(1) 

except: 
    print "Quiting" 
finally: 
    # Remove the sample listener when done 
    controller.remove_listener(listener) 

Бросить на любой ключевой ход в обоих Idle и в командной строке, казалось на удивление трудным и сложным, когда я попробовал это некоторое время назад - но тогда, я Python простофиля.

Смежные вопросы