水一篇,VB+python实现智能聊天机器人案例

news2024/11/16 5:25:21

1.分工

理论上单python也能写,但是做gui开发,python要用到thinter库/qt库,稍微麻烦一点。这个案例是python做json截取,VB做gui开发+截取json字符。


2.准备工作

编写生成file_controlv2.dll并注册,编写speaker.vbs,准备python环境,并通过pip安装pyinstaller和request 通过pyinstaller -F get_page.py生成新的exe供VB使用,get_page.py、file_controlv2.dll 和 speaker.vbs参考以下代码

get_page.py

import requests
import sys


def get_page(msg):
    page=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg='+msg)
    print( page.text)
    f = open("pageinfo", "a")
    f.write(page.text)
    f.close()

if __name__ == '__main__':
     print (sys.argv[1])
     get_page(sys.argv[1])

file_controlv2.dll

speaker.vbs

Set objArgs = WScript. Arguments
CreateObject("SAPI.SpVoice").speak objArgs(0)

file_controlv2.dll

Public Function file_controldll() As Boolean
    file_controldll = True
End Function
Public Sub set_text(filepath As String, mode As Integer, txt As String) 'mode是模式,txt是写入内容,filepath是写入的文件路径
    Select Case mode
        Case 1
            Open filepath For Output As #1
        Case 3
            Open filepath For Append As #1
    End Select
            Print #1, systemout + txt & vbCrLf;
    Close #1
End Sub

Public Function get_text(filepath As String)
    Dim lines As String
    If filepath <> "" Then
    Open filepath For Input As #1
        Do While Not EOF(1)
            DoEvents
            Line Input #1, NextLine
            lines = lines & NextLine & vbCrLf   'vbcrif是换行的意
        Loop
    Close #1
    get_text = lines + Chr(13)
    End If
End Function

Public Function get_lines(filepath As String)
Dim lines As Integer
    Open filepath For Input As #1
       Do While Not EOF(1)
           Line Input #1, Str1
           lines = lines + 1
       Loop
    Close #1
    get_lines = lines
End Function
Public Function get_linetext(filepath As String, lines As Integer)
     Open filepath For Binary As #1
        a = StrConv(InputB(LOF(1), 1), vbUnicode)
    Close #1
    b = Split(a, vbCrLf)
    get_linetext = b(lines - 1)
End Function

要将Instancing的值设置为6,生成dll文件,并在创建新工程后引用,主程序工程名不能与dll工程名一样,否则会报错


3.摆放布局和编写主程序代码

具体布局如图所示

 具体代码:

''''''''''''''''
'智能ai系统demo
'PYTHON+VB混合编程 && 简单api获取实例(实际就是做字符串的切割) && 微软自带语音包
'API青客云
'用到的库:file_controlv2.dll 源码:GITHUB,另一个仓库
'power by wh
''''''''''''''''
Sub speak(str)
    DoEvents
    'CreateObject("SAPI.SpVoice").speak str
    Shell "cscript speaker.vbs" & Chr(32) & str '''降低卡顿'''
End Sub



Private Sub close_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then End
End Sub

Private Sub Command1_Click()
    If Text1.Text = "" Or Text1.Text = "请输入信息,并点击发送" Then Exit Sub
    inputstr = Text1.Text
    Text1.Text = ""
    If Dir(App.Path + "\pageinfo") <> "" Then Kill App.Path + "\pageinfo"
    dialog.AddItem CStr(Time) + ":" + Chr(32) + "你:" & inputstr
    wait_for_run App.Path + "\get_page.exe" & Chr(32) & inputstr
    recevieinfo
End Sub

Sub recevieinfo() '''获取信息'''
   'JSON样例  {"result":0,"content":"“111”是啥意思?"}
   '处理思路:直接截取:"content"后的文本,替换""和}为空就完事了
    recevice = get_text(App.Path + "\pageinfo")
    format_text = "{" & Chr(34) & "result" & Chr(34) & ":0,content" & Chr(34) & ":"
    '''让}和""为空
    ai_text = _
    Replace(Replace(Mid(recevice, Len(format_text) + 2), Chr(34), ""), "}", "")
    speak ai_text
    dialog.AddItem CStr(Time) + Chr(32) + "智能AI:" & ai_text
End Sub



Private Sub Form_Load()
    If Not isadmin Then MsgBox "权限不足", vbInformation, "提示": End
    If Not isnetworking Then MsgBox "网络未连接", vbInformation, "提示": End
End Sub

Private Sub imagebutt_Click(Index As Integer)
      Shell "cmd /c start http://www.baidu.com"
End Sub



'''''无窗体移动
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call movewindows(Me.hwnd, X, Y)
End Sub

Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call movewindows(Me.hwnd, X, Y)
End Sub
'''

'''类似安卓hint
Private Sub Text1_GotFocus()
    If Text1.Text = "请输入信息,并点击发送" Then Text1.ForeColor = vbBlack: Text1.Text = ""
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then Command1_Click
End Sub

Private Sub Text1_LostFocus()
    If Text1.Text = "" Then Text1.ForeColor = &H808080: Text1.Text = "请输入信息,并点击发送"
End Sub
'''

SystemAPImoduel.bas

'''''''''''''
'
'系统api模块(包括topmost,无窗体边框移动)
'power by wh
'updata:2022 12 6
'
'''''''''''''
'''声明
Private Declare Function ReleaseCapture Lib "user32" () As Long '无窗体解锁
'''无边框窗体移动'''
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
'''等待程序运行结束'''
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

'''延迟,mathv3的yc函数就是调用的这个api'''
Private Declare Sub Sleep Lib "kernel32.DLL" (ByVal dwMilliseconds As Long)

'''常量声明'''
Private Const SWP_NOMOVE = &H2 '不移动窗体
Private Const SWP_NOSIZE = &H1 '不改变窗体尺寸
Private Const Flag = SWP_NOMOVE Or SWP_NOSIZE
Private Const HWND_TOPMOST = -1 '窗体总在最前面
Private Const HWND_NOTOPMOST = -2 '窗体不在最前面



Function isnetworking() As Boolean
     '''测试网络连接模块,vb6太特殊写不出不加winsock/其他dll的代码'''
     If Dir(Environ("temp") + "\isnetworking.dll") <> "" Then Kill (Environ("temp") + "\isnetworking.dll") '生成临时文件,只要pc环境变量没问题这里就不会有问题
     Shell "cmd /c ping /n 1 www.baidu.com  && echo %errorlevel% > %temp%\isnetworking.dll"
     Sleep 1000 '1000毫秒,1秒
     If Not Dir(Environ("temp") + "\isnetworking.dll") <> "" Then isnetworking = False: Exit Function '这种情况属于特殊情况,网络没有连接可能出现,我也不知道为什么,还有就是权限不够
     If Val(get_text(Environ("temp") + "\isnetworking.dll")) = 0 Then isnetworking = True Else isnetworking = False '获取cmd传出的errorlevel值
End Function


Function isadmin() As Boolean
    On Error GoTo noadmin
    set_text Environ("windir") + "\admin.dll", 1, "test" '写入一个文件到windows安装目录,如果存在代表有管理员权限,否则就没有,win7以下系统不用考虑这个问题
    If Dir(Environ("windir") + "\admin.dll") <> "" Then Kill Environ("windir") + "\admin.dll": isadmin = True: Exit Function
noadmin:
    isadmin = True
End Function


Sub topmost(istopmost As Boolean, formhwnd As Long) ''遇到全屏被底部任务栏遮挡,可以考虑用这个''
    Select Case istopmost
        Case True
            SetWindowPos formhwnd, HWND_TOPMOST, 0, 0, 0, 0, Flag
        Case False
            SetWindowPos formhwnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flag
    End Select
End Sub


Sub movewindows(formhwnd As Long, X As Single, Y As Single)
    ReleaseCapture 'api实现拖动窗体移动,无边框窗体本来不可移动,加上这句就可以了
    SendMessage formhwnd, &HA1, 2, 0&
End Sub

Sub wait_for_run(exe As String) '不可用于bat!
'''''''''''''''''''
'运行程序模块,逻辑是等待程序运行
'''''''''''''''''''
    i = Shell(exe) 'i为pid
    p = OpenProcess(&H100000, False, i) '字面意思打开进程句柄
    DoEvents
    r = WaitForSingleObject(p, -1)
    r = CloseHandle(p) '关闭句柄
End Sub


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java实现获取当前日期、农历、周

大家好&#xff0c;我是雄雄。 前言 大家先看下面的一段话&#xff1a; 今天是&#xff1a;2022年12月18日&#xff0c;星期日&#xff0c;农历十一月廿五&#xff0c;早安&#x1f31e;&#x1f31e;&#x1f31e; 1.讣告 | 我国著名眼科专家兰绪达在南昌逝世&#xff0c;享…

Linux 多线程(附带线程池代码加注释)

目录 01. Linux线程概念 01.1 什么是线程 01.1.1 轻量级进程ID与进程ID之间的区别 01.1.2 总结&#xff08;重点&#xff09; 01.2 线程的优点 01.3 线程的缺点 01.4 线程异常 01.5 线程用途 02. Linux进程VS线程 02.1 进程和线程 02.2 关于多线程和多进程编程 03…

Pytorch中的卷积与反卷积(conv2d和convTranspose2d)

卷积 卷积是特征提取的常用操作&#xff0c;卷积可以改变图片的通道和大小&#xff0c;相比全连接操作&#xff0c;卷积可以减少计算量&#xff0c;并且充分融合图像的局部特征。 import torch import torch.nn as nnx torch.randn(1,1,4,4) model nn.Conv2d(in_channels1,o…

Spring MVC学习 | 注解配置Spring MVC总结

文章目录一、注解配置Spring MVC1.1 初始化类1.2 Spring MVC配置类1.3 完整配置过程二、总结2.1 常用组件2.2 执行流程学习视频&#x1f3a5;&#xff1a;https://www.bilibili.com/video/BV1Ry4y1574R 一、注解配置Spring MVC 1.1 初始化类 &#x1f511;注解配置的原理 在…

非零基础自学Golang 第10章 错误处理 10.1 错误处理的方式 10.2 自定义错误

非零基础自学Golang 文章目录非零基础自学Golang第10章 错误处理10.1 错误处理的方式10.2 自定义错误10.2.1 错误类型10.2.2 创建错误10.2.3 自定义错误格式第10章 错误处理 我们在编写程序时&#xff0c;为了加强程序的健壮性&#xff0c;往往会考虑到对程序中可能出现的错误…

大数据必学Java基础(一百一十三):监听器概念引入

文章目录 监听器概念引入 一、什么是监听器? 二、监听器怎么分类?

SQL - MySQL深分页

一、MySQL深分页问题 我们在日常开发中&#xff0c;查询数据量比较大的时候&#xff0c;后端基本都会通过前端&#xff0c;移动端传过来的页码&#xff0c;每页数据行数&#xff0c;通过SQL中的 limit 进行分页&#xff0c;如果查询页数比较小的时候&#xff0c;不会出现太大问…

【有营养的算法笔记】 二分+排序/堆 求解矩阵中战斗力最弱的 K 行

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;有营养的算法笔记 ✉️分类专栏&#xff1a;题解 文章目录一、题目描述二、思路及代码实现1. 二分 排序2.…

【学习笔记】JDK源码学习之Vector(附带面试题)

【学习笔记】JDK源码学习之Vector&#xff08;附带面试题&#xff09; 什么是 Vector &#xff1f;它的作用是什么&#xff1f;它的底层由什么组成&#xff1f;是否是线程安全的&#xff1f; 老样子&#xff0c;跟着上面的问题&#xff0c;我们层层深入了解 Vector 吧。 1、…

Linux——linux面试题

cat a.txt | cut -d "/" -f 3 | sort | uniq -c |sort -nrgrep ESTABLISHED | awk -F " " {print $5} |cut -d ":" -f 1 | sort |uniq -c | sort -nr找回mysql的root用户的密码 首先&#xff0c;进入到/etc/my.cnf&#xff0c;插入一句skip-gra…

Apache Hudi Timeline

Timeline | Apache Hudi Hudi维护了在不同时刻在表上执行的所有操作的时间线&#xff0c;这有助于提供表的即时视图&#xff0c;同时也有效地支持按到达顺序检索数据。Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08…

windows下配置chrome浏览器驱动的详细攻略

要想使用python去爬取互联网上的数据&#xff0c;尤其是要模拟登录操作。那么selenium包肯定是绕不过的。 selenium包本质上就是通过后台驱动的方式驱动浏览器去。以驱动chrome浏览器为例&#xff0c;搭建环境如下&#xff1a; 1、查看本机chrome浏览器的版本。 方式是&#x…

第三十二章 linux-模块的加载过程二

第三十二章 linux-模块的加载过程二 文章目录第三十二章 linux-模块的加载过程二HDR视图的第二次改写模块导出的符号HDR视图的第二次改写 在这次改写中&#xff0c;HDR视图中绝大多数的section会被搬移到新的内存空间中&#xff0c;之后会根据这些section新的内存地址再次改写…

[附源码]计算机毕业设计Python“小世界”私人空间(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等…

知到/智慧树——程序设计基础(C语言)进阶篇

目录 第一章测试 第二章测试 第三章测试 第四章测试 第五章测试 第一章测试 第1部分总题数: 10 1 【单选题】 (10分) 在C语言中&#xff0c;将属于不同类型的数据作为一个整体来处理时&#xff0c;常用&#xff08; &#xff09;。 A. 简单变量 B. 数组类型数据 C. 结…

论文投稿指南——中文核心期刊推荐(力学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

10.union all、N天连续登录

有日志如下&#xff0c;请写出代码求得所有用户和活跃用户的总数及平均年龄。&#xff08;活跃用户指连续两天都有访问记录的用户&#xff09; 数据准备 最后需完成的结果表 步骤1&#xff0c;所有用户的总数及平均年龄 (1). 将数据去重 with t1 as (select distinctuser_i…

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别

如何使用交换机、路由器及防火墙进行组网以及他们之间的功能和区别。 几乎大部分网络都有交换机、路由器和防火墙这三种基本设备,因此这三种设备对于网络而言非常重要,很多人对这三种设备的使用容易弄混。 一般网络部署: 或者抽象为这种部署模式: 几乎每个网络都有交换…

别再写jsp了,Thymeleaf它不香吗?

啥是 Thymeleaf在学 Thymeleaf 之前我们先看一下使用 jsp 开发遇到的主要问题&#xff1a;jsp 的痛点1.页面包含大量 java 代码&#xff0c;代码太混乱<% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head> &l…

webpack实现自动代码编译

前置 使用webpack构建开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码。操作二&#xff1a;通过live server或者直接通过浏览器&#xff0c;打开index.html代码&#xff0c;查看效果。为了完成自动编译&…