【问题标题】:create a com_record an object from a COM defined type从 COM 定义的类型创建一个 com_record 对象
【发布时间】:2017-12-23 05:17:28
【问题描述】:

我刚刚开始使用 win32com.client 模块尝试编写一个 Python 程序,该程序使用 COM 接口来控制 MicroStation,这与我过去从 Excel 控制 MicroStation 的方式很相似。

我遇到的问题是创建在 COM 库中定义的类型的对象,即 com_record,在我的例子中是 Point3d。 Point3d 基本上是 3 个双 X,Y,Z 的 C 结构。

struct Point3d {
    double X;
    double Y;
    double Z;
}

在 Excel 中引用 MicrostationDGN 库后,我可以访问 Point3d 数据类型,并且可以使用 Dim newpoint As Point3d 轻松定义新变量

如何在 Python 中做同样的事情?

谢谢,

PS。我尝试创建一个 C 结构,但这给了我一个错误

from ctypes import Structure, c_double

class Point3d(Structure):
    _fields_ = [('X', c_double),
                ('Y', c_double)]

startPoint = Point3d()
startPoint.X = 1
startPoint.Y = 1

TypeError: Only com_record objects can be used as records

【问题讨论】:

  • 我在这里找到了一些信息python.6.x6.nabble.com/…,但我仍然不知道如何制作我需要的 com_record 对象。

标签: python win32com


【解决方案1】:

您正在寻找named tuple

从文档中引用(大致),你想要:

Point3d = namedtuple('Point3d', ['x', 'y', 'z'])

【讨论】:

  • 感谢您的回复!我刚试过,但它产生了同样的错误... TypeError: Only com_record objects can be used as records
  • 对不起。我试图引导您远离 ctypes 并转向纯 python(命名元组)方法。但是,如果您打算将生成的点对象传递给您的问题中未提及的某个例程,那么是的,您必须遵循该接口的文档。您在评论中提到了一个 URL,该 URL 建议使用特定于 Windows 的 COM 支持,而不是 python 的可移植 ctypes 支持。
【解决方案2】:

我从图书馆作者那里找到了这个:

r = win32com.client.Record("RecordName", object)

其中“RecordName”是记录的名称,“object”是 &any* COM 对象定义在同一个类型库中。

https://mail.python.org/pipermail/python-list/2003-August/214888.html

我找不到该类型的对象来实例化所描述的 com_record,但我设法找到了一个返回我需要的对象的函数。

startPoint = MS.Point3dFromXYZ(2.0,2.0,0.0)

【讨论】:

    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多