七叶笔记 » golang编程 » Go语言编程,开发一个错题本

Go语言编程,开发一个错题本

概要:回顾一下这些天来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=auto
GOPROXY=
PKG_CONFIG_PATH=c:/msys64/mingw64/lib/pkgconfig
GOROOT=c:/go  

1.4、检查环境

 在命令行输入命令:
go get github.com/gotk3/gotk3/gtk 
下载gotk3的gtk源码,如果编译成功,则证明环境安装OK。  

2.MacOS环境搭建

2.1 配置国内镜像

 echo 'export GOPROXY=#39; >>~/.bash-profile
source ~/.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-profile
source ~/.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/treeview
go 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 by
const (
//COLUMN_ICON = iota
COLUMN_TEXT = iota      //导航栏 现在只有一列,文本
)
var gdb *sql.DB
var gtvw *gtk.TreeView       //记事本 目录导航栏
var gtkmenu * gtk.Menu       //弹出式菜单
var gtStore *gtk.TreeStore   //导航栏数据store

func 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()
//db
gdb = opendb("./ctb.sqlite3")
defer gdb.Close()
createtable(gdb)
//
var anode ANODE

readimgfrombuf(nil,"./8.png",&anode.b)
anode.Title="测试title"
insert2mu(gdb,anode)
//
gtk.Main()

}  

其他代码请移步Gitee仓库

到此,运行起来显示如下:

主窗口内有格Paned组件,可以调整两边子窗口大小。

左边子窗口BOX,内放一个TreeView,treeView中访用户自定义的内容,因为作为记事本,可以自己重命名而作为导航栏。以后加入popup菜单,可以添加子节点。(扩展到:增加,删除,前插,后插,增子节点,重命名节点)

后续还需要增加:

1、导航栏 高度超过一屏则自动出现滚动条

2、搜索功能

3、导航栏 增删改查,排序

4、每个错题的内容展示,支持图文展示

5、错题内容搜索

6、内容关键字标签

等等

代码放到gitee了()感兴趣的同学可以参与项目开放,我以后工作不忙会坚持开发更新。

争取通过这个Go学习项目,来掌握GOLANG编程。

我是程序员黑洞,正在学习Gotk GUI编程,欢迎关注,留言,欢迎参与我的gitee mynote项目。

相关文章