Оболочка PyQt5 для объекта ActiveX вместо обертки WX - PullRequest
1 голос
/ 08 февраля 2020

Я пытаюсь заставить USB-камеру отображать видео в реальном времени в приложении PyQt5. У меня есть рабочий код для оболочки wx, но мне нужно это для работы в PyQt5. После многих поисков я просто не могу найти правильный синтаксис.

Вот рабочий код WX:

import wx
from wx.lib.activexwrapper import MakeActiveXClass
from win32com.client import gencache

class mainFrm( wx.Frame ):
    def __init__( self, *args, **kwds ):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__( self, *args, **kwds )

        self.dcamModule = gencache.EnsureModule( '{6B9BD678-9710-44D9-9282-A088094E4216}', 0, 1, 0 )       
        dcamClass = MakeActiveXClass( self.dcamModule.ActiveGeni, eventObj = self )
        self.camera = dcamClass( self, -1 )

        self.camera.SetSize(( 752, 480 ))
        self.SetClientSize( ( 752, 480 ))

        self.camera.Acquire = True 
        self.camera.Display = True


if __name__ == '__main__':
    GUI = wx.PySimpleApp( 0 )
    frame_1 = mainFrm( None, -1, "" )
    GUI.SetTopWindow( frame_1 )
    frame_1.Show()
    GUI.MainLoop()

Когда я отлаживаю то, что происходит, это то, что я получаю, когда объекты создаются :

print(self.dcamModule)
<module 'win32com.gen_py.6B9BD678-9710-44D9-9282-A088094E4216x0x1x0' from '...\\AppData\\Local\\Temp\\3\\gen_py\\3.5\\6B9BD678-9710-44D9-9282-A088094E4216x0x1x0.py'>

print(dcamClass)
<class 'wx.lib.activexwrapper.AXControl_ActiveGeni'>

print(self.camera)
<win32com.gen_py.None.AXControl_ActiveGeni>

Вот PyQt5, который я пробовал. Не выдает ошибку, но и не запускает камеру:

import sys
from PyQt5 import uic, QtWidgets
from PyQt5.QAxContainer import QAxWidget

qtCreatorFile = "ui\\camera_form.ui"
LandingPageUI, LandingPageBase = uic.loadUiType(qtCreatorFile)

class cameraForm(LandingPageBase, LandingPageUI):

    def __init__(self,  parent=None):
        QtWidgets.QMainWindow.__init__(self)
        LandingPageBase.__init__(self)
        self.setupUi(self)

        self.ocx = QAxWidget("'{6B9BD678-9710-44D9-9282-A088094E4216}', 0, 1, 0 ")
#Is there something else to do here?
        self.ocx.Acquire = True
        self.ocx.Display = True
        self.axWidget = self.ocx     #axWidget is the QaXWidget on the form


if __name__ == "__main__":
    app=QtWidgets.QApplication.instance() 
    if not app: 
         app = QtWidgets.QApplication(sys.argv)

    window = cameraForm()
    window.show()
    sys.exit(app.exec_())


Когда я пробую версию PyQt, это то, что я получаю при отладке:

print(self.axWidget)
<PyQt5.QAxContainer.QAxWidget object at 0x036C4C60>

Это Кажется, что шаг MakeActiveXClass для wx делает что-то, что не было сделано с PyQt, но я не могу понять, каким он должен быть.

Вот некоторые ресурсы, на которые я ссылался до сих пор:

win32. Диспетчер против win32.gencache в Python. Каковы плюсы и минусы?

Что вы можете сделать с COM / ActiveX в Python?

Я также пробовал QCamera, но это не распознает камеру.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Создание self.axWidget = self.ocx не приводит к замене self.ocx в окне self.axWidget, решение заключается в использовании self.axWidget путем установки элемента управления с помощью метода setControl () :

class cameraForm(LandingPageBase, LandingPageUI):
    def __init__(self, parent=None):
        super(cameraForm, self).__init__(parent)
        self.setupUi(self)

        self.axWidget.setControl("{6B9BD678-9710-44D9-9282-A088094E4216}")
        self.axWidget.setProperty("Acquire", True)
        self.axWidget.setProperty("Display", True) 

(код не проверен)

0 голосов
/ 09 февраля 2020

Получил это, найдя правильный вызов в setControl. Не уверен, почему CLSID не сработал, но это сработало:

    self.axWidget.setControl("ActiveGeni.ActiveGeni")

Я рад использовать эту функцию в Qt, но я все еще не уверен, как узнать, какие другие activeX я могу вызвать. Например, я мог бы использовать «Веб-браузер Microsoft» и загрузить PDF, но не «Adobe PDF Reader». Как посмотреть что доступно?

...