Pregunta

Estoy programando una aplicación pyS60 simple, en realidad no he hecho nada con python o usando varios subprocesos antes, así que todo esto es un poco nuevo para mí. Para mantener la aplicación abierta, configuro un e32.Ao_lock para esperar () después de que se inicialice el cuerpo de la aplicación, y luego señalo el bloqueo en el exit_key_handler.

Una de las tareas que puede hacer el programa es abrir una aplicación de terceros, UpCode. Esto escanea un código de barras y copia la cadena de códigos de barras en el portapapeles. Cuando cierro UpCode, mi aplicación debe reanudarse y pegar la entrada desde el portapapeles. Sé que esto se puede lograr usando Ao.lock, pero ya he llamado a una instancia de esto. Idealmente, mi aplicación recuperaría el enfoque después de notar que algo se había pegado en el portapapeles. ¿Puedo lograr lo que necesito con una de las funciones de suspensión o temporizador?

Puede encontrar el script completo aquí , y lo he abreviado para las partes necesarias a continuación:

lock=e32.Ao_lock()

# Quit the script
def quit():
    lock.signal()

# Callback function will be called when the requested service is complete. 
def launch_app_callback(trans_id, event_id, input_params):
    if trans_id != appmanager_id and event_id != scriptext.EventCompleted:
        print "Error in servicing the request"
        print "Error code is: " + str(input_params["ReturnValue"]["ErrorCode"])
        if "ErrorMessage" in input_params["ReturnValue"]:
            print "Error message is: " + input_params["ReturnValue"]["ErrorMessage"]
    else:
        print "\nWaiting for UpCode to close"
    #lock.signal()

# launch UpCode to scan barcode and get barcode from clipboard
def scan_barcode():
    msg('Launching UpCode to scan barcode.\nPlease exit UpCode after the barcode has been copied to the clipboard')
    # Load appmanage service
    appmanager_handle = scriptext.load('Service.AppManager', 'IAppManager')
    # Make a request to query the required information in asynchronous mode
    appmanager_id = appmanager_handle.call('LaunchApp', {'ApplicationID': u's60uid://0x2000c83e'}, callback=launch_app_callback)
    #lock.wait()
    #print "Request complete!"
    barcode = clipboard.Get()
    return barcode

# handle the selection made from the main body listbox
def handle_selection():
    if (lb.current() == 0):
        barcode = scan_barcode()
    elif (lb.current() ==1):
        barcode = clipboard.Get()
    elif (lb.current() ==2):
        barcode = input_barcode()

    found = False
    if is_barcode(barcode):
        found, mbid, album, artist = identify_release(barcode)
    else:
        msg('Valid barcode not found. Please try again/ another method/ another CD')
        return

    if found:
        go = appuifw.query(unicode('Found: ' + artist + ' - ' + album + '\nScrobble it?'), 'query')
        if (go == 1):
            now = datetime.datetime.utcnow()
            scrobble_tracks(mbid, album, artist, now)
        else:
            appuifw.note(u'Scrobbling cancelled', 'info')
    else:
        appuifw.note(u'No match found for this barcode.', 'info')

# Set the application body up
appuifw.app.exit_key_handler = quit
appuifw.app.title = u"ScanScrobbler"
entries = [(u"Scan a barcode", u"Opens UpCode for scanning"),
           (u"Submit barcode from clipboard", u"If you've already copied a barcode there"),
           (u"Enter barcode by hand", u"Using numeric keypad")
          ]

lb = appuifw.Listbox(entries, handle_selection)
appuifw.app.body = lb

lock.wait()

Cualquier y toda ayuda apreciada.

¿Fue útil?

Solución

Resolví este problema definiendo un segundo bloqueo separado y asegurándome de que solo uno estaba esperando a la vez. Parece funcionar sin ningún problema. El código actual se puede encontrar en alojado en el código de Google

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top