**go walk 两天的使用情况**
先上dome 就是代码(阅读此文章,你能了解到怎么布局及关联事件,打开文件等操作)
直接对着代码说
```
package main
import (
"bufio"
"fmt"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
#窗口实例
type MyMainWindow struct {
*walk.MainWindow //窗口
edit *walk.TextEdit //文本框
}
func main() {
//初始化实例
mw := &MyMainWindow{}
//创建 (界面编辑都在这里,这里使用的是代码布局,不知道有没有什么设计大师什么的,要是有的话,就好了)
err := MainWindow{
AssignTo: &mw.MainWindow, //关联变量
Title: "文件选择框对话框", // 标题
MinSize: Size{Width: 300, Height: 200}, //最小 尺寸
MaxSize: Size{Width: 600, Height: 200}, //最大尺寸
Size: Size{Width: 600, Height: 200}, //显示尺寸
Layout: VBox{}, // 水平布局
Children: []Widget{ //内部嵌套控件
GroupBox{ //组容器
Layout: HBox{},
Children: []Widget{
LinkLabel{ //标签
Text: "文件路径:",
MinSize: Size{Width: 60, Height: 20},
MaxSize: Size{Width: 60, Height: 20}, //控件大小,没有知道默认显示尺寸。就找到这个方式了,控制大小(特别不好用)
},
TextEdit{ //输入文本框
Text: "请选择文件",
AssignTo: &mw.edit,
MinSize: Size{Width: 400, Height: 20},
MaxSize: Size{Width: 400, Height: 20},
},
PushButton{ //按钮
Text: "打开文件",
MinSize: Size{Width: 60, Height: 40},
MaxSize: Size{Width: 60, Height: 40},
OnClicked: mw.selectFile, //点击事件触发函数
},
},
MinSize: Size{Width: 550, Height: 60}, //组容器的大小调节
MaxSize: Size{Width: 550, Height: 60},
},
HSplitter{ //垂直布局
Children: []Widget{
VSplitter{ //横向布局
Children: []Widget{
HSplitter{
Children: []Widget{
LinkLabel{
Text: "key:",
MinSize: Size{Width: 120, Height: 20},
MaxSize: Size{Width: 120, Height: 20},
},
TextEdit{
Text: "请选择文件",
AssignTo: &mw.edit,
MinSize: Size{Width: 150, Height: 20},
MaxSize: Size{Width: 150, Height: 20},
},
},
},
HSplitter{
Children: []Widget{
LinkLabel{
Text: "pos:",
MinSize: Size{Width: 120, Height: 40},
MaxSize: Size{Width: 120, Height: 40},
},
TextEdit{
Text: "请选择文件",
AssignTo: &mw.edit,
MinSize: Size{Width: 150, Height: 20},
MaxSize: Size{Width: 150, Height: 20},
},
},
},
},
},
PushButton{
MinSize: Size{Width: 10, Height: 60},
MaxSize: Size{Width: 10, Height: 60},
Text: "另存为",
OnClicked: mw.saveFile,
},
},
},
},
}.Create()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
mw.Run() //执行
}
// 打开文件资源,选择文件
func (mw *MyMainWindow) selectFile() {
dlg := new(walk.FileDialog)
dlg.Title = "选择文件"
dlg.Filter = "所有文件(*.*)|*.*"
mw.edit.SetText("")
if ok, err := dlg.ShowOpen(mw); err != nil {
mw.edit.SetText("Error: File Open\r\n")
return
} else if !ok {
mw.edit.SetText("未选择文件\r\n")
return
}
s := fmt.Sprintf(" %s\r\n", dlg.FilePath)
mw.edit.SetText(s)
}
//下面的都是go 基础了
//自己编写一个函数,接收两个文件路径 srcFileName dstFileName
func CopyFile(srcFileName string, dstFileName string) (written int, err error) {
content, err := ioutil.ReadFile(srcFileName)
if err != nil {
fmt.Printf("read file err=%v", err)
}
//打开dstFileName
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
defer dstFile.Close()
//通过dstFile, 获取到 Writer
writer := bufio.NewWriter(dstFile)
// if written == 0 {
// fmt.Println("读取数据为0")
// return
// }
//输出内容
key := "zy"
encrypt_stream(content, len(content), key, 4096)
writer.Write(content)
writer.Flush()
return
}
func (mw *MyMainWindow) saveFile() {
fmt.Println(mw.edit.Text())
fileName := "F:\\桌面\\web下载\\123.xls" //遇到的坑,不能接受的,edit.Text获取的路劲为 F:\桌面\web下载。。单斜杠的,然后后期使用贼麻烦
outfileName := "F:\\桌面\\web下载\\1234.xls"
_, err := CopyFile(fileName, outfileName)
if err != nil {
fmt.Println("ReadBlck err ", err)
}
}
```
***拒接理由***
1、文档不友好,全英文的,没有控件效果展示,和简单案例
2、结构体内部变量文档中没有说明,需要自己看代码,选项还不明确,组件大小控制不方便
3、路径问题,win 下直接凉凉
4、之前用过qt,和qt差距太大
5、相关博客只有系统dome 案例,没有任何阅读意义,基本属于空白
***代码只完成了一半。单walk相关代码是可以执行的***
![walk.png](https://static.studygolang.com/200513/f8a38476feeecd2a857a8ddd9c7ebd27.png)
有疑问加站长微信联系(非本文作者))