2016-09-20 2 views
0

내 코드는 이벤트의 print 문에서 필요한 것을 인쇄합니다. 그러나 클래스가 인스턴스화되는 방식 때문에 데이터를 반환하는 방법을 알지 못합니다. 또한 print 문은 pythoncom.PumpWaitingMessages()가 포함되어있을 때만 작동하지만 인쇄 된 데이터는 반환하지 않습니다.제 3 자 COM을 사용하여 DispatchWithEvents 이벤트 반환

다른 함수가 액세스 할 반환 값으로 인쇄 된 것을 사용할 수 있기를 바랍니다.

(더 악화에 오는 경우에, 나는) 최후의 수단 인 (표준 출력을 캡처 할 수 있습니다.)

코드 :

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

출력 :

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> 

답변

0

내 솔루션은 같다 다음과 같습니다. 이것은 추악하고 틀릴 수도 있지만 그것이 필요한 것을 가지고 있습니다. 누구든지 더 좋은 방법을 가지고 있다면 기꺼이 편집 할 수 있습니다.

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