go使用walk创建window界面,与ai对话+键盘回车事件+聊天记录+隐藏cmd窗口

go使用walk创建window界面,与ai对话:https://blog.csdn.net/daily886/article/details/97657654

下面我们为该对话功能拓展 +键盘回车事件+聊天记录+隐藏cmd窗口

修改 aichatwindow/model/windowdialog.go ,windowdialog.go 内容如下:

package model

import (
	"fmt"
	"strconv"

	"github.com/tidwall/gjson"
	"github.com/spf13/viper"
	"github.com/lxn/walk"
	. "github.com/lxn/walk/declarative"

	. "aichatwindow/handler"
)

/*-------------------window界面-------------------*/
func OpenWindow() {
	mw := &MyMainWindow{}

	if _, err := (MainWindow{
		AssignTo: &mw.MainWindow,
		Title:    "AI对话",
		//Icon:     "test.ico", //图标文件路径
		MinSize:  Size{300, 400},
		Layout:   VBox{},
		Children: []Widget{
			GroupBox{
				Layout: HBox{},
				Children: []Widget{
					LineEdit{ //对话输入框
						AssignTo: &mw.searchBox,
						OnKeyDown: func(key walk.Key) { //键盘事件
							if key == walk.KeyReturn {//回车键
								mw.clicked()
							}
						},
					},
					PushButton{ //对话按钮
						Text:      "对话",
						OnClicked: mw.clicked,  //鼠标点击左键事件
					},
				},
			},
			ListBox{ //聊天记录框
				AssignTo: &mw.message,
			},
			ListBox{ //实时聊天框
				AssignTo: &mw.results,
				Row:      5,
			},
		},
	}.Run());
	err != nil {
		fmt.Printf("Run err: %+v\n",err)
	}
}

type MyMainWindow struct {
	*walk.MainWindow
	searchBox *walk.LineEdit
	message  *walk.ListBox
	results   *walk.ListBox
}

func (mw *MyMainWindow) clicked() {
	word := mw.searchBox.Text()
	message := mw.message.Model() //获取以前的聊天记录
	fmt.Println("message",message);
	model := []string{} //ai对话
	record := []string{} //聊天记录
	if message != nil {
		for _,v := range message.([]string){
			record = append(record,v)  //插入以前的聊天记录
		}
	}
	record = append(record,fmt.Sprintf("我:%v", word)) //先显示我的 信息
	for _, value := range search( word) {
		model = append(model, fmt.Sprintf("ai回复:%v", value))
		record = append(record, fmt.Sprintf("ai回复:%v", value))  //再显示ai回复信息
	}
	mw.results.SetModel(model) //实时聊天输出
	mw.message.SetModel(record) //聊天记录输出

}

/*-------------------图灵接口-------------------*/
//获取tuling接口回复
func TulingAi(info string) (string,error) {
	api := viper.GetString("common.tuling.api")

	//发送http请求图灵api  , body是http响应
	var body, resultErrs = HttpRequest(api,info,"POST")
	if resultErrs != nil {
		fmt.Printf("HttpRequest err: %+v\n",resultErrs)
	}

	return body, nil
}

//回复信息构造体
type tlReply struct {
	code int
	Text string `json:"text"`
}

//图灵搜索
func search( word string) (res []string) {
	res = []string{}
	var userId = "1";
	//图灵接口参数构造体
	var chattingInfo = BuildChatting(word,userId, viper.GetString("common.tuling.apikey"))
	fmt.Printf("chattingInfo: %+v\n",chattingInfo)
	// 参数构造体 转换成 字符串
	chatstr,err := ConvertJson(chattingInfo)
	if err != nil{
		fmt.Printf("ConvertJson err: %+v\n",err)
		return
	}

	//调用图灵接口
	body,err := TulingAi(chatstr)
	if err != nil{
		fmt.Printf("TulingAi err: %+v\n",err)
		return
	}
	fmt.Printf("body err: %+v\n",body)
	var results string
	// 使用gjson 获取返回结果的 resultType
	result := gjson.Get(body, "results.#.resultType")
	for key, name := range result.Array() {
		//如果 resultType 是 text格式
		if name.String() == "text"{
			//获取对应 key 的 values里的text ,就是图灵回复的文字
			getstring := "results."+strconv.Itoa(key)+".values.text"
			fmt.Printf("getstring: %+v\n",getstring)
			result_text := gjson.Get(body,getstring)
			results = result_text.String()
			res = append(res, results)
		}
	}
	return
}

使用walk修改代码后,需要 使用rsrc命令重新创建 rsrc.syso文件

[root@localhost aichatwindow]# find / -name rsrc
/root/go/bin/rsrc
/root/go/pkg/mod/cache/download/github.com/akavel/rsrc
/root/go/pkg/mod/github.com/akavel/rsrc@v0.8.0/rsrc
 
 
[root@localhost aichatwindow]# /root/go/bin/rsrc -manifest aichatwindow.manifest -o rsrc.syso

打包成window系统的 .exe 文件 , 如果想要隐藏 cmd窗口,go build 加上参数  -ldflags="-H windowsgui"

# 不隐藏cmd 窗口
[root@localhost aichatwindow]# CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

# 隐藏cmd 窗口
[root@localhost aichatwindow]# CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-H windowsgui"

把aichatwindow.exe复制到window系统下,双击运行 aichatwindow.exe 即可运行,效果如下:

 

walk事件参考:https://github.com/lxn/walk/blob/master/keyboard.go

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值