【问题标题】:Windows Application Automation with python/COM使用 python/COM 实现 Windows 应用程序自动化
【发布时间】:2019-01-01 07:24:14
【问题描述】:

我正在尝试在后台为用户自动化 ChemDraw,最好避免使用 SendKeys(),因为我认为这需要一个 ChemDraw 实例才能工作。我需要做的是以某种方式以编程方式单击编辑 -> 复制为 -> InChI,然后从 Windows 剪贴板中检索结果。

我们目前正在使用 Python 和 COM 脚本来尝试此操作。这是我们当前的代码:

    # Opens ChemDraw and loads the file, while keeping the window hidden.
    ChemDraw = w32.DispatchEx('ChemDraw.Application') # ChemDraw Application Object
    ChemDraw.Visible = False                          # Makes Invisible
    Compound= ChemDraw.Documents.Open(cdx_filepath)      # ChemDraw File Object (Can be seen with ChemDraw.Activate())

    # Selects the whole molecule.
    Compound.Objects.Select()

    # Here is where we need to figure out how to do CopyAs and Save off clipboard content.

    # Saves the file and Quits afterwards.
    Compound.SaveAs(jpg_filepath)
    ChemDraw.Quit()

我想我有两个问题:我们如何访问工具栏中的“编辑”以及其中的结果值?如何获取由“ChemDraw = w32.DispatchEx('ChemDraw.Application')”之类的行生成的对象并确定可以用它做什么?部分问题是我们似乎无法自省生成的 DispatchEx 对象,因此我们很难回答自己的问题。

【问题讨论】:

    标签: python automation com win32com


    【解决方案1】:

    关于如何访问“编辑”菜单内容的第一个问题将特定于 ChemDraw 本身,没有这个问题,我无法立即给出解决方案。

    但是,也许对第二个问题有答案可以让您自己回答第一个问题,因此,这里是:假设 ChemDraw COM 对象允许它,您可以使用win32com.client.gencache.EnsureDispatch 代替DispatchEx为对象自动生成 Python 类;这使您可以更详细地检查对象。除了使用EnsureDispatch,您还可以直接访问底层代码生成功能,这可能更适用于您的工作流程。有关详细信息,请参阅 this questionthis guide

    【讨论】:

      【解决方案2】:

      由于 COM 脚本的复杂性,我认为您不能真正“访问编辑菜单”,但有一个解决方案可以访问和存储 InChI 字符串:

      对于初学者,我强烈建议您使用 comtypes 而不是 win32com,因为当您使用 dir() 时,它会提供更多信息,据我所知,语法几乎相同。 Win32com 几乎没有提供任何功能,因此您实际上是在黑暗的房间里寻找针头来实现纯粹的功能(除非您有可用的 SDK)。从那里,您打开 ChemDraw 文件,访问 Objects 类,然后使用 Data() 方法并输入“chemical/x-inchi”(在您的情况下)。我也一直在为一个项目使用 ChemDraw,我必须做同样的事情,所以这就是你想要的:

      import comtypes.client as w32
      # Path for experimental ChemDraw File.
      cdx_file = # Insert ChemDraw file path here
      
      # Creates invisible ChemDraw object.
      ChemDraw = w32.CreateObject("ChemDraw.Application")
      ChemDraw.Visible = True
      
      # Creates file object.
      Compound = ChemDraw.Documents.Open(cdx_file)
      
      # Converts file to InChI string.
      file_inchi = Compound.Objects.Data("chemical/x-inchi")
      print(file_inchi)
      
      # Closes ChemDraw
      ChemDraw.Quit()
      

      P.S.:CreateObject 是 win32com 的 DispatchEx() 的comtypes 等价物。

      Comtypes 文档:https://pythonhosted.org/comtypes/

      ChemDraw SDK:http://www.cambridgesoft.com/services/documentation/sdk/chemdraw/ActiveX11/ChemDrawControl10_P.html

      【讨论】:

      • 这很有帮助。这是否也以某种方式在另一个方向起作用:从 InChI 开始并生成 ChemDraw 文件(.cdx 或 .cdxml)?
      • @theozh 假设您的剪贴板中已经有 InChI 字符串,您可以复制 InChI 字符串并将该字符串粘贴到 ChemDraw 中,这将导致相应的结构显示在 ChemDraw 文件中。因此,您可以编写一个打开 ChemDraw 的 COM 脚本 -> 将该字符串粘贴到 ChemDraw 工作区 -> 然后保存生成的文件。
      • 谢谢!我希望我能找到如何打开一个空的 ChemDraw 文件、粘贴剪贴板内容和保存文件的必要信息。我假设要咨询的主要来源是 pythonhosted.org/comtypes ,对吗?
      • 这绝对是了解更多关于 comtypes 包的好参考,尽管特定应用程序中的 COM 脚本可能会在开发人员端涉及更多调试。事实上,我会编辑我的答案以引用该网站。
      • hmmm,即使不在insideinformatics.cambridgesoft.com/categories/chemistry/… 上,我也找不到任何有关 ChemDraw 的具体信息。您从哪里获得有关 ChemDraw 课程的信息?也许你可以看看stackoverflow.com/q/58183902/7295599 并给出一些提示?
      猜你喜欢
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 2019-08-11
      • 1970-01-01
      • 2021-10-30
      • 2022-06-11
      相关资源
      最近更新 更多