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.