概要:回顾一下这些天来GoLang学习知识点,并开始一个错题本开发。
一、编程环境搭建
1、windows系统
IDE使用GoLand 2020.1。
1.1、安装MSYS2(msys2-x86_64-20200720.exe),这是UINX-like developement 开发环境--一些软件工具包和库,还有GTK工具栈。
1.2、GUI编程选择gotk3。
pacman -Smingw-w64-x86_64-gtk3mingw-w64-x86_64-cairo mingw-w64-x86_64-pkg-configmingw-w64-x86_64-glade
1.3、配置环境变量
GO111MODULE=autoGOPROXY=https://goproxy.cnPKG_CONFIG_PATH=c:/msys64/mingw64/lib/pkgconfigGOROOT=c:/go
1.4、检查环境
在命令行输入命令:go get github.com/gotk3/gotk3/gtk 下载gotk3的gtk源码,如果编译成功,则证明环境安装OK。
2.MacOS环境搭建
2.1 配置国内镜像
echo 'export GOPROXY=https://goproxy.cn' >>~/.bash-profilesource ~/.bash-profile
2.2 系统必须安装xcode-select
xcode-select --install
如果你的MacOS不支持,就需要到Developer Apple上手动下载对应的“Command Line Tools”安装即可
2.3、安装gotk3的编译环境
brew install pkg-config gtk+3 adwaita-icon-theme
2.4、配置环境变量PKG_CONFIG_PATH
echo 'export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig' >>~/.bash-profilesource ~/.bash-profile 执行这行命令,使配置生效
2.5、配置编译模式
cho 'export GO111MODULE=auto' >>~/.bash-profile source ~/.bash-profile
2.6、安装gotk3
go get github.com/gotk3/gotk3/gtk 下载并编译gtk3
2.7、打开示例代码目录,
cd gtk-example/treeviewgo mod init treeview 初始化module文件,go从1.13开始默认module模式编译go run treeview.go 编译并执行示例代码
二、记事本程序
GUI编程的核心,MVC设计模式:
Model-----View----Controler
model:数据对象,一般指存储数据的store对象,每种可视化对象都有响应的store对象来配合使用。
View:可视化对象,一般是指可视控件,如button,treeview,menu,toolbar,entry,statusbar,box,scrollbar,window等等 。
Controler:指数据和可视对象之间传递数据变化或者用户操作的控制部分。
比如:用户点击了菜单按钮,菜单按钮就要响应,并弹出一个菜单。要实现这个响应就需要实现注册一个click事件到按钮组件上。这样按钮被点击时,按钮就知道要处理这个注册事件了。具体这个响应函数怎么处理,则需要这个click响应函数来体现。
当用户在搜索框输入了一个关键字,点击了搜索按钮,则触发按钮点击事件,事件事先注册到按钮,此时触发响应函数。函数去查询数据库,返回查询结果,结果这个数据要显示到界面上,比如显示到text组件内,则需要settext给text赋值,text组件通过的值变化,会在内部触发一个update事件,update响应函数会重新draw text的显示区。这样从用户到数据,或从数据到显示的中间链接部分成为Controler。
事件驱动,让编程变得模式清晰。
初始原型,界面设计如下
MainWindow Design
来看下实现代码:
// IDs to access the tree view columns byconst (//COLUMN_ICON = iotaCOLUMN_TEXT = iota //导航栏 现在只有一列,文本)var gdb *sql.DBvar gtvw *gtk.TreeView //记事本 目录导航栏var gtkmenu * gtk.Menu //弹出式菜单var gtStore *gtk.TreeStore //导航栏数据storefunc ecp(e error){if e!=nil {log.Fatal("error:",e)}}func main() {gtk.Init(nil)win,err:=gtk.WindowNew(gtk.WINDOW_TOPLEVEL); ecp(err)win.SetTitle("错题本 0.0.1")win.Connect("destroy", func() {gtk.MainQuit()})fBoxl,err :=gtk.BoxNew(gtk.ORIENTATION_VERTICAL,1)setupTopitem(fBoxl,[]string{"语文","数学","英语","生物","化学","历史","政治"})fBoxl.SetMarginEnd(5);fBoxl.SetMarginStart(5)fBoxl.SetMarginTop(5);fBoxl.SetMarginBottom(5)fBoxl.ShowAll()setuppopmenu()//fBoxr,err :=gtk.BoxNew(gtk.ORIENTATION_VERTICAL,1)lbl,err:=gtk.LabelNewWithMnemonic("列表")fBoxr.PackStart(lbl,false,false,5)fBoxr.ShowAll()fPaned,err:= gtk.PanedNew(gtk.ORIENTATION_HORIZONTAL)fPaned.SetTooltipText("")fPaned.SetBorderWidth(3)fPaned.Add1(fBoxl)fPaned.Add2(fBoxr)win.Add(fPaned)win.SetDefaultSize(800, 600) //设置主窗口宽高像素win.SetPosition(gtk.WIN_POS_CENTER)fPaned.ShowAll()win.ShowAll()//dbgdb = opendb("./ctb.sqlite3")defer gdb.Close()createtable(gdb)//var anode ANODEreadimgfrombuf(nil,"./8.png",&anode.b)anode.insert2mu(gdb,anode)//gtk.Main()}
其他代码请移步Gitee仓库
到此,运行起来显示如下:
主窗口内有格Paned组件,可以调整两边子窗口大小。
左边子窗口BOX,内放一个TreeView,treeView中访用户自定义的内容,因为作为记事本,可以自己重命名而作为导航栏。以后加入popup菜单,可以添加子节点。(扩展到:增加,删除,前插,后插,增子节点,重命名节点)
后续还需要增加:
1、导航栏 高度超过一屏则自动出现滚动条
2、搜索功能
3、导航栏 增删改查,排序
4、每个错题的内容展示,支持图文展示
5、错题内容搜索
6、内容关键字标签
等等
代码放到gitee了(https://gitee.com/laogg/mynote)感兴趣的同学可以参与项目开放,我以后工作不忙会坚持开发更新。
争取通过这个Go学习项目,来掌握GOLANG编程。
我是程序员黑洞,正在学习Gotk GUI编程,欢迎关注,留言,欢迎参与我的gitee mynote项目。