【问题标题】:PyQt5 wrapper for ActiveX object instead of WX wrapper用于 ActiveX 对象的 PyQt5 包装器,而不是 WX 包装器
【发布时间】:2020-05-24 04:10:57
【问题描述】:

我正在尝试让 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>

似乎 wx 的 MakeActiveXClass 步骤正在做一些 PyQt 没有做的事情,但我不知道它应该是什么。

以下是我目前参考的一些资源:

win32.Dispatch vs win32.gencache in Python. What are the pros and cons?

What can you do with COM/ActiveX in Python?

我也试过 QCamera,但它无法识别相机。

【问题讨论】:

    标签: python qt pyqt5 qt5 activex


    【解决方案1】:

    制作self.axWidget = self.ocx不会导致self.ocx替换窗口中的self.axWidget,解决方法是通过使用setControl()方法设置控件来使用self.axWidget

    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) 
    

    (代码未测试)

    【讨论】:

    • 感谢您的回答!我的代码一定有多个问题,因为那并没有解决它。使用调试输出查看我的编辑。
    • @jshort 我不明白为什么你认为 Wx 和 Qt 中的调试应该相似。另一方面,self.axWidget.generateDocumentation() 的输出是什么?
    • @jshort 尝试将self.axWidget.setProperty("Acquire", True) 更改为self.axWidget.dynamicCall("Acquire", True)self.axWidget.setProperty("Display", True) 更改为self.axWidget.dynamicCall("Display", True)
    • generateDocumentation() 没有产生任何东西,而且它对 dynamicCall 并不挑剔,但你是对的,当然,关于如何使用 setControl。虽然从来没有让它与 CLSID 一起工作
    【解决方案2】:

    通过在 setControl 中找到正确的调用使其工作。不知道为什么 CLSID 不起作用,但确实如此:

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

    我很高兴在 Qt 中使用此功能,但我仍然不确定如何查看我可以调用的其他 activeX。例如,我可以使用“Microsoft Web Browser”并加载 PDF,但不能使用“Adobe PDF Reader”。如何查看可用的内容?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2019-05-31
      • 2011-02-25
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多