0

我的代码从 Events 中的 print 语句中打印出我需要的内容。但是,由于类的实例化方式,我不知道如何返回数据。此外,打印语句仅在包含 pythoncom.PumpWaitingMessages() 时才有效,但它不会返回打印的数据或任何内容。

我希望能够使用打印的内容作为返回值,以供其他函数访问。

(如果情况变得更糟,我可以捕获标准输出(这是最后的手段)。)

代码:

# 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>
4

1 回答 1

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
于 2016-09-23T15:33:43.780 回答