2016-09-20 6 views
0

Mon code imprime ce dont j'ai besoin à partir de l'instruction d'impression dans Événements. Mais, je n'ai aucune idée comment retourner les données en raison de la façon dont la classe est instanciée. En outre, l'instruction print ne fonctionne que si pythoncom.PumpWaitingMessages() est inclus, mais ne renvoie pas les données imprimées ou quoi que ce soit. Je voudrais pouvoir utiliser ce qui est imprimé comme une valeur de retour pour être accessible par d'autres fonctions.Renvoyer des événements à partir de DispatchWithEvents à l'aide d'un agent COM

(Si le pire arrive au pire, je pouvais capturer stdout (qui est un dernier recours).)

code:

# Standard Lib 
import time 
# Third Party 
from win32com.client import DispatchWithEvents 
import pythoncom 
# Local Lib 
import scan_var 


class Events(object): 
    def OnBarcodeEvent(self, eventType=pythoncom.Empty, pscanData=pythoncom.Empty): 
     print pscanData 
     return pscanData 

zebra = DispatchWithEvents("CoreScanner.CoreScanner", Events) 

# open api 
open_status = zebra.Open(0, [1], 1) 
print "Open status: {}".format(open_status) 
# get scanners 
get_scanners = zebra.GetScanners(0, [1]) 
print "get_scanners: {}".format(get_scanners) 
# Register for events 
register = zebra.ExecCommand(1001,scan_var.register_for_events) 
print "register: {}".format(register) 
# PEWPEWPEW (pull trigger) 
fire_result = zebra.ExecCommand(2011, scan_var.pull_trigger) 
print "PEWPEWPEW {}".format(fire_result) 
time.sleep(5) 

while True: 
    time.sleep(1) 
    pythoncom.PumpWaitingMessages() 

Sortie:

Open status: 0 
get_scanners: (1, (1,),504</VID> <PID>6400</PID> ... 
register: (u'', 0) 
PEWPEWPEW (u'', 0) 
<?xml version="1.0" encoding="UTF-8"?> 
<outArgs> 
    <scannerID>1</scannerID> 
    <arg-xml> 
     <scandata> 
      <modelnumber>new_hotness </modelnumber> 
      <serialnumber>1522501a0501156 </serialnumber> 
      <GUID>2A4BE99CFCEFD047837ADF0082aD51AD5</GUID> 
      <datatype>27</datatype> 
      <datalabel>0x39 0x32 0x304 ...</datalabel> 
      <rawdata>0x22 0x03 0x00 ... </rawdata> 
     </scandata> 
    </arg-xml> 
</outArgs> 

Répondre

0

Ma solution est aussi suit. Cela peut être moche et faux, mais cela m'a donné ce dont j'avais besoin. Si quelqu'un a un meilleur moyen, je suis heureux de modifier.

class Events(object): 

    def get_barcode(self): 
     return self.pscanData 

    def OnBarcodeEvent(self, eventType=1, pscanData=pythoncom.Empty): 
     self.pscanData = pscanData 
     print self.pscanData 



def save_serial_to_cache(): 
    zebra = DispatchWithEvents("CoreScanner.CoreScanner", Events) 
    # open api 
    open_status = zebra.Open(0, [1], 1) 
    print "Open status: {}".format(open_status) 
    #get scanners 
    get_scanners = zebra.GetScanners(0, [1]) 
    print "get_scanners: {}".format(get_scanners) 
    # Register for events 
    register = zebra.ExecCommand(1001,scan_var.register_for_events) 
    print "register: {}".format(register) 
    # PEWPEWPEW (pull trigger) 
    fire_result = zebra.ExecCommand(2011, scan_var.pull_trigger) 
    print "PEWPEWPEW {}".format(fire_result) 
    for counter in xrange(0, 5): 
     time.sleep(1) 
     pythoncom.PumpWaitingMessages() 
    return zebra._obj_.get_barcode.__self__.pscanData