with tutorial rapid programming pagina oficial gui documentacion and python com pyqt activex pyqt4

tutorial - python 3.7 pyqt5



No se pueden pasar argumentos al objeto COM de ActiveX utilizando PyQt4 (1)

Intento escribir un código Python para hablar con el control ActiveX APT de Thorlabs. Estoy basando mi código en el código que se encuentra en esta página , pero trato de usar el contenedor PyQt4 ActiveX en lugar del contenedor wxPython ActiveX. Funciona para un método ActiveX muy simple, sin embargo, aparece un error cuando intento llamar a un método que toma argumentos.

Este código funciona y muestra el cuadro Acerca de Thorlabs APT:

import sys from ctypes import * from PyQt4 import QtGui from PyQt4 import QAxContainer class APTSystem(QAxContainer.QAxWidget): def __init__(self, parent): self.parent = parent super(APTSystem, self).__init__() self.setControl(''{B74DB4BA-8C1E-4570-906E-FF65698D632E}'') # calling this method works self.AboutBox() app = QtGui.QApplication(sys.argv) a = APTSystem(app)

Cuando reemplazo self.AboutBox() con un método con argumentos, por ejemplo:

num_units = c_int() self.GetNumHWUnitsEx(21, byref(num_units))

Me sale un error: TypeError: unable to convert argument 1 of APTSystem.GetNumHWUnitsEx from ''CArgObject'' to ''int&''

Supongo que el tipo de argumento debe ser de tipo ctypes. ¿Hay algún tipo de magia que pueda resolver esto?


Resulta que tenía la sintaxis bastante incorrecta, la resolví utilizando la función generateDocumentation() como se menciona aquí , y algunos parámetros de ayuda desde aquí . El código de trabajo se ve así:

import sys from PyQt4 import QtGui from PyQt4 import QAxContainer from PyQt4.QtCore import QVariant class APTSystem(QAxContainer.QAxWidget): def __init__(self, parent): super(APTSystem, self).__init__() # connect to control self.setControl(''{B74DB4BA-8C1E-4570-906E-FF65698D632E}'') # required by device self.dynamicCall(''StartCtrl()'') # args must be list of QVariants typ = QVariant(6) num = QVariant(0) args = [typ, num] self.dynamicCall(''GetNumHWUnits(int, int&)'', args) # only list items are updated, not the original ints! if args[1].toInt()[1]: print ''Num of HW units ='', args[1].toInt()[0] self.dynamicCall(''StopCtrl()'') app = QtGui.QApplication(sys.argv) a = APTSystem(app)

El segundo elemento de la lista args contiene el valor correcto, pero num nunca se actualiza con la llamada.