VB联合Python开发

2023-11-16

用到 Python,首先你肯定得装一个Python吧,用3.x的

创建一个.py文件

说明:需要引用pythoncom  (这个需要pip install pywin32 )

import pythoncom
class PythonUtilities:

    _public_methods_=['SplitString']
    _public_methods_ = ['httpBom']
    _reg_progid_='PythonDemos.Utilities'
    _reg_clsid_=pythoncom.CreateGuid()

    def SplitString(self, val, item=None):
        import string
        if item !=None:
            item=str(item)
        val=str(val)
        return val.split(item)

    def httpBom(self):
        return  "hhh"

if __name__=='__main__':
    print ('Registering COM server...')
    import win32com.server.register
    win32com.server.register.UseCommandLine(PythonUtilities)
然后在VB中就可以使用Python中的方法了

Private Sub Command1_Click()
    Set PythonUtils = CreateObject("PythonDemos.Utilities")
'    response = PythonUtils.SplitString("Hello from VB My name is Leo Liu")
'    For Each Item In response
'        List1.AddItem Item
'    Next
    MsgBox PythonUtils.httpBom
End Sub
最终的使用方法

cmd 中 输入 : Python PythonDemos.py

然后VB就可以使用Python这个类中发方法了

如果想要注销这个COM

python PythonDemos.py --unregister 

然后将这个文件打包成 exe:

安装 pin install pyinstaller

Pyinstaller -F WFJieKouPY.py    #打包成多文件
Pyinstaller -D WFJieKouPY.py    #打包成单文件

注意:需要引用 import win32timezone  否则报错

import pypyodbc
import os
import requests
import pythoncom
import json
import win32com.server.register
import win32timezone
class PythonUtilities:
    _public_methods_ = ['FindBoms', 'SendBoms', 'test', 'GetData']
    _reg_progid_ = 'WFJieKouPY.Utilities'
    _reg_clsid_ = pythoncom.CreateGuid()

    accountId = ""
    tenantId = "sxqcdev"
    appId = "DEVTEST"
    appSecuret = "!QAZ2wsx#EDC4rfv"
    language = "zh_CN"

    user = "SQESB"
    usertype = "UserName"

    appTokenUrl = r'http://172.16.127.102:8081/ierp/api/getAppToken.do'
    accessTokenUrl = r'http://172.16.127.102:8081/ierp/api/login.do'
    pushBomUrl = r'http://172.16.127.102:8081/ierp/kapi/app/iscb/sf_bom_save'
    findBomUrl = r'http://172.16.127.102:8081/ierp/kapi/app/iscb/sf_bom_query'
    # 获取密码
    def GetKey(self):
        #####获取app_token
        data = {
            "accountId": self.accountId,
            "tenantId": self.tenantId,
            "appId": self.appId,
            "appSecuret": self.appSecuret,
            "language": self.language
        }
        headers = {
            "Content-Type": "application/json",
        }
        res = requests.post(url=self.appTokenUrl, json=data, headers=headers)
        res = res.json()
        if (res['state'] == "success"):
            app_token = res['data']['app_token']
            # print("app_token:" + app_token)
        else:
            return ""

        #########获取access_token
        data = {
            "user": self.user,
            "apptoken": app_token,
            "tenantId": self.tenantId,
            "accountId": self.accountId,
            "usertype": self.usertype
        }
        headers = {
            "Content-Type": "application/json",
        }
        res = requests.post(url=self.accessTokenUrl, json=data, headers=headers)
        res = res.json()
        if (res['state'] == "success"):
            access_token = res['data']['access_token']
            # print("access_token:" + access_token)
        else:
            return ""

        return access_token  # 返回密钥

    # # 取数据整合出成json格式
    # def GetData(self, path=os.getcwd() + r'\data\data.mdb'):
    #
    #     # 连接数据库
    #     # path = os.getcwd() + r'\data\data.mdb'  # 数据库文件
    #     # path = 'E:\万方接口程序\data\data.mdb'
    #
    #     conn = pypyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + path + ";Uid=;Pwd=;")
    #     cursor = conn.cursor()
    #     # ===========================获取某个表数据内容======================================================
    #     SQL_value = "SELECT * FROM 万方BOM表  ORDER BY material"  # 查表
    #     cursor.execute(SQL_value)
    #     result = cursor.fetchall()  # 生成表格
    #     data = {
    #         "boms": []
    #     }
    #     lastBom = ""
    #     if (len(result) > 0):
    #         for row in result:  # 按行输出
    #
    #             if (len(data['boms']) == 0 or lastBom != row[3]):  # 空的直接添加)
    #
    #                 data['boms'].append({
    #                     "createorg_number": row[1],
    #                     "version_number": row[2],
    #                     "material": row[3],
    #                     "wzta_sccj": row[4],
    #                     "wzta_versionremark": row[5],
    #                     "wzta_luxian": row[6],
    #                     "wzta_chexing": row[7],
    #                     "entry": []
    #                 })
    #                 data['boms'][len(data['boms']) - 1]['entry'].append({
    #                     "entrymaterial_number": row[8],
    #                     "wzta_tzyl": float(row[9]),
    #                     "wzta_gongweihao": row[10],
    #                     "wzta_zijiaoxianhao": row[11],
    #                     "wzta_weizhihao": row[12],
    #                     "wzta_tuzhidaihao": row[13],
    #                     "wzta_tuzhichicun": row[14],
    #                     "wzta_gongyiremark": row[15],
    #                     "entryqtynumerator": float(row[16]),
    #                     "entryoperationnumber": row[17],
    #                 })
    #             else:
    #                 data['boms'][len(data['boms']) - 1]['entry'].append({
    #                     "entrymaterial_number": row[8],
    #                     "wzta_tzyl": float(row[9]),
    #                     "wzta_gongweihao": row[10],
    #                     "wzta_zijiaoxianhao": row[11],
    #                     "wzta_weizhihao": row[12],
    #                     "wzta_tuzhidaihao": row[13],
    #                     "wzta_tuzhichicun": row[14],
    #                     "wzta_gongyiremark": row[15],
    #                     "entryqtynumerator": float(row[16]),
    #                     "entryoperationnumber": row[17],
    #
    #                 })
    #             lastBom = row[3]
    #
    #         # print(json.dumps(data,sort_keys=True,indent=4,ensure_ascii=False))
    #
    #     cursor.close()
    #     conn.close()
    #     return data
    #     # return json.dumps(data,ensure_ascii=False)

    # 查询物料是否存在
    def FindBoms(self, material, createorg_number='351'):
        # arr = []
        # arr.append(material)
        if material == "" :
            return
        data = {
            "number": material.split(","),
            "createorg_number": createorg_number
        }
        accessToken = self.GetKey()
        # print(accessToken)
        headers = {
            "Content-Type": "application/json",
            "accessToken": accessToken
        }
        res = requests.post(url=self.findBomUrl, json=data,
                            headers=headers)
        return json.dumps(res.json(), ensure_ascii=False)

    # # 推送BOM
    # def SendBoms(self, path=os.getcwd() + r'\data\data.mdb'):
    #     data = self.GetData(path)
    #     if (len(data["boms"]) <= 0):
    #         return {
    #             "status": False,
    #             "message": "数据表中没有待发送的物料。"
    #         }
    #
    #     accessToken = self.GetKey()
    #     # print(accessToken)
    #     headers = {
    #         "Content-Type": "application/json",
    #         "accessToken": accessToken
    #     }
    #     res = requests.post(url=self.pushBomUrl, json=data,
    #                         headers=headers)
    #     return json.dumps(res.json(), ensure_ascii=False)


    # # 推送BOM
    def SendBoms(self, bomStr):

        if bomStr == "":
            return
        boms = [] #存放推送数组
    #     先分组
        materialFZArr = bomStr.split("‖")
        for fzStr in materialFZArr:
            # 头部分组
            singleArr = fzStr.split("※")
            headArr = singleArr[0].split("→")
            boms.append({
                "createorg_number": headArr[0],
                "version_number":  headArr[1],
                "material":  headArr[2],
                "wzta_sccj":  headArr[3],
                "wzta_versionremark":  headArr[4],
                "wzta_luxian":  headArr[5],
                "wzta_chexing":  headArr[6],
                "entry": []
            })
            for zjStr in singleArr[1].split("▷"):
                zjStrArr = zjStr.split("→")
                boms[len(boms)-1]["entry"].append({
                    "entryoperationnumber": zjStrArr[0],
                    "entrymaterial_number": zjStrArr[1],
                    "entryqtynumerator": float(zjStrArr[2]),
                    "wzta_tzyl": float(zjStrArr[3]),
                    "wzta_gongweihao": zjStrArr[4],
                    "wzta_zijiaoxianhao": zjStrArr[5],
                    "wzta_weizhihao": zjStrArr[6],
                    "wzta_tuzhidaihao": zjStrArr[7],
                    "wzta_tuzhichicun": zjStrArr[8],
                    "wzta_gongyiremark":zjStrArr[9]
                })

        #print(boms)
        # return boms

        accessToken = self.GetKey()
        # print(accessToken)
        headers = {
            "Content-Type": "application/json",
            "accessToken": accessToken
        }
        res = requests.post(url=self.pushBomUrl, json=boms,
                            headers=headers)
        return json.dumps(res.json(), ensure_ascii=False)

    def test(self, str='zhw'):
        return str


print('Registering COM server...')


win32com.server.register.UseCommandLine(PythonUtilities)

input("运行成功!Press <Enter>")

# if __name__ == '__main__':
#     print('Registering COM server...')
#     import win32com.server.register
#
#     win32com.server.register.UseCommandLine(PythonUtilities)
#
#     input("运行成功!")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB联合Python开发 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • 注意力机制——CAM、SAM、CBAM、SE

    CAM SAM CBAM详见 CBAM 即插即用的注意力模块 附代码 目录 1 什么是注意力机制 2 通道注意力机制 SE 1 Squeeze 2 Excitation 3 SE Block 3 CAM 4 SAM 5 CBAM 6 代码
  • 一篇文章入门C/C++自动构建利器之Makefile

    更多博文 请看音视频系统学习的浪漫马车之总目录 C C 编译 浅析C C 编译本质 一篇文章入门C C 自动构建利器之Makefile 升级构建工具 从Makefile到CMake Makefile简介 上一篇浅析C C 编译本质已经比较详
  • UE4修改splitScreen layout方式

    UE4自身提供了分屏显示的方法 可以分成两个屏幕 也可以分成三个屏幕 但提供的分屏布局方式有限 包括两个玩家分屏布局 Vertical Horizontal 三个玩家分屏布局 Favor Top Favor Bottom 这里提供给大家一种
  • 华为OD机试真题 Java 实现【光伏场地建设规划】【2023Q1 100分】

    一 题目描述 祖国西北部有一片大片荒地 其中零星的分布着一些湖泊 保护区 矿区 整体上常年光照良好 但是也有一些地区光照不太好 某电力公司希望在这里建设多个光伏电站 生产清洁能源 对每平方公里的土地进行了发电评估 其中不能建设的区域发电量为
  • 【TS】联合类型

    文章目录 TS 联合类型 1 普通变量声明 2 数组声明使用 3 函数中使用 TS 联合类型 联合类型即通过管道 将变量设置多种类型 赋值时可以根据设置的类型来赋值 1 普通变量声明 let res number string boolea
  • MySQL中的事务、索引、锁机制

    目录 一 MySQL基础架构 二 MySQL中的索引 1 什么是索引 索引的作用 2 索引的类型 1 主键索引 Primary Key 2 二级索引 辅助索引 3 索引的底层数据结构 1 B 树 B 树 2 为什么选择B B 树 为什么要用
  • 图块引用、属性块引用、创建新层表、ObjectArx开发中静态变量和全局变量要点

    一 图块设计技术 在AutoCAD数据库中 以各图块实际上市存储在块表记录里的实体集合 每个图块从一格AcDbBlockBegin对象开始 紧接着是一个或多个AcDbEntity对象 最后以AcDbBolckEnd对象结束 按其所属关系得层
  • Googleplay从服务器检索信息时出错。[DF-DFERH-01]

    googleapis cn services googleapis cn 两个地址强制走代理就OK了 转载于 https www cnblogs com Devopser p 10269312 html
  • Linux下利用TCP的服务端和客户端实现简单收发消息

    服务端采用了线程 可以同时提供给多台客户端连接 TCP的服务端 tcp server c include
  • 每秒上万并发下的Spring Cloud性能优化之道

    本文为转载文章 作者 中华石杉 十余年BAT架构经验 倾囊相授 作者微信公众号 石杉的架构笔记 ID shishan100 一 写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构 毕竟现在这是非常火的一门技术
  • MySQL中的any_value()函数

    转载 MySQL中的any value 函数 小李小李彬彬有礼的博客 CSDN博客
  • 深入探索透视投影变换(续)

    潘宏 2009 4 14 本人水平有限 疏忽错误在所难免 还请各位数学高手 编程高手不吝赐教 email popyy netease com B站专栏 https b23 tv oWsl6PD 在上一篇文章中我们讨论了透视投影变换的原理 分
  • 涂鸦NBIOT OpenCPU开发快速入门(三)

    1 开发板选择 工欲善其事 必先利其器 我之前做了两款开发板 其实主要是为了我工作上开发的方便 第一款用来测试通用对接 的方式比较友好 第二个板子主要特色在于开发调试起来非常方便 涂鸦 模组多个平台的芯片都是默认三个串口的 烧录口 通讯口
  • 《算法导论》选择问题(找第K大的数)

    选择问题 Selection Problem 即在n个元素的集合中寻找第K小的元素的问题 第K小的元素又叫第K个顺序统计量 有以下几种变体 找最大值和最小值 同时找最大和最小值 找中位数 第n 2小 找任意第K小的元素 找Top K的元素
  • 当SpringCloud微服务发生线程隔离(舱壁模式)和熔断降级时(微服务失败的回调),利用FeignClient整合Sentinel,返回用户一个友好提示或者默认结果

    目录 一 线程隔离 1 1线程隔离的两种实现方式 二 熔断降级 2 1慢调用 2 2异常比例 2 3异常数 三 FeignClient整合Sentinel 3 1修改配置 开启sentinel功能 3 2编写失败降级逻辑 3 2 1利用Fa
  • 贪心(acwing)

    每次选择当前的最优解 没什么固定的套路 先试一些做法 举例子验证 尝试证明一下 严格地推 区间问题 例1 1 将每个区间按照右端点从小到大排序 2 从前往后依次枚举每个区间 如果当前区间已经包含点 则直接pass 否则选择当前区间的右端点
  • Cenos6.5 安装Gcc编译器

    本人使用的是CentOS 6 5 64位系统 由于在安装系统的时候并没有勾选安装gcc编译器 因此需要自行安装gcc编译器 使用yum安装gcc 对于配备了yum的Linux发行版而言 安装gcc编译器就变得so easy 我们只需要分别执
  • 三维数据处理软件架构

    三维数据处理软件都包含哪些模块 三维数据处理软件 一般包含三个模块 数据管理和处理 三维渲染 UI 这与图形学的三个经典问题是相对应的 建模 渲染和交互 与一般常见的数据处理软件 比如图像视频处理 不同的是 这里的数据展示模块需要三维渲染
  • numpy中的mean()函数

    mean 函数定义 numpy mean a axis dtype out keepdims mean 函数功能 求取均值 经常操作的参数为axis 以m n矩阵举例 axis 不设置值 对 m n 个数求均值 返回一个实数 axis 0
  • VB联合Python开发

    用到 Python 首先你肯定得装一个Python吧 用3 x的 创建一个 py文件 说明 需要引用pythoncom 这个需要pip install pywin32 import pythoncom class PythonUtiliti