Frage

Ich programmiere ein einfaches PyS60 app, nicht wirklich mit Python etwas getan oder mehrere Threads verwendet werden, bevor so das alles ein bisschen neu für mich ist. Um die App geöffnet zu halten, habe ich eine e32.Ao_lock () zu warten, nachdem der Körper der Anwendung initialisiert wird, und dann wird das Signal das Schloss an der exit_key_handler.

Eine der Aufgaben das Programm tun kann, ist eine dritte Partei App öffnen, UpCode. Dieser scannt einen Barcode und kopiert das Barcode-String in die Zwischenablage. Wenn ich UpCode schließen, sollte meine Bewerbung fortsetzen und die Eingabe aus der Zwischenablage einfügen. Ich weiß, das Ao.lock erreicht werden kann, aber ich habe bereits eine Instanz dieses genannt. Im Idealfall würde meine Anwendung des Fokus wieder nach zu bemerken, etwas in die Zwischenablage eingefügt worden ist. Kann ich erreichen, was ich mit einem der Schlaf oder Timer-Funktionen benötigen?

Sie können das vollständige Skript finden hier , und ich habe es kurz die notwendigen Teile unter:

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()

Jede und alle Hilfe geschätzt.

War es hilfreich?

Lösung

Ich löste dieses Problem, indem eine separate zweite Sperre definieren und sicherstellen, dass nur ein zu einer Zeit zu warten. Es scheint, ohne Probleme zu arbeiten. Aktuelle Code gefunden werden kann auf Google Code gehostet

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top