如上图,从左到右用来TreeView、TableView、WebView

定义了一个名为Directory的目录结构体,每个目录理论上有一个父节点,有0到n个子节点。

type Directory struct {name     stringparent   *Directorychildren []*Directory
}

filebrowser.go

// Copyright 2011 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.package mainimport ("log""os""path/filepath""time"
)import ("github.com/lxn/walk". "github.com/lxn/walk/declarative"
)type Directory struct {name     stringparent   *Directorychildren []*Directory
}func NewDirectory(name string, parent *Directory) *Directory {return &Directory{name: name, parent: parent}
}var _ walk.TreeItem = new(Directory)func (d *Directory) Text() string {return d.name
}func (d *Directory) Parent() walk.TreeItem {if d.parent == nil {// We can't simply return d.parent in this case, because the interface// value then would not be nil.return nil}return d.parent
}func (d *Directory) ChildCount() int {if d.children == nil {// It seems this is the first time our child count is checked, so we// use the opportunity to populate our direct children.if err := d.ResetChildren(); err != nil {log.Print(err)}}return len(d.children)
}func (d *Directory) ChildAt(index int) walk.TreeItem {return d.children[index]
}func (d *Directory) Image() interface{} {return d.Path()
}func (d *Directory) ResetChildren() error {d.children = nildirPath := d.Path()if err := filepath.Walk(d.Path(), func(path string, info os.FileInfo, err error) error {if err != nil {if info == nil {return filepath.SkipDir}}name := info.Name()if !info.IsDir() || path == dirPath || shouldExclude(name) {return nil}d.children = append(d.children, NewDirectory(name, d))return filepath.SkipDir}); err != nil {return err}return nil
}func (d *Directory) Path() string {elems := []string{d.name}dir, _ := d.Parent().(*Directory)for dir != nil {elems = append([]string{dir.name}, elems...)dir, _ = dir.Parent().(*Directory)}return filepath.Join(elems...)
}type DirectoryTreeModel struct {walk.TreeModelBaseroots []*Directory
}var _ walk.TreeModel = new(DirectoryTreeModel)func NewDirectoryTreeModel() (*DirectoryTreeModel, error) {model := new(DirectoryTreeModel)drives, err := walk.DriveNames()if err != nil {return nil, err}for _, drive := range drives {switch drive {case "A:\\", "B:\\":continue}model.roots = append(model.roots, NewDirectory(drive, nil))}return model, nil
}func (*DirectoryTreeModel) LazyPopulation() bool {// We don't want to eagerly populate our tree view with the whole file system.return true
}func (m *DirectoryTreeModel) RootCount() int {return len(m.roots)
}func (m *DirectoryTreeModel) RootAt(index int) walk.TreeItem {return m.roots[index]
}type FileInfo struct {Name     stringSize     int64Modified time.Time
}type FileInfoModel struct {walk.SortedReflectTableModelBasedirPath stringitems   []*FileInfo
}var _ walk.ReflectTableModel = new(FileInfoModel)func NewFileInfoModel() *FileInfoModel {return new(FileInfoModel)
}func (m *FileInfoModel) Items() interface{} {return m.items
}func (m *FileInfoModel) SetDirPath(dirPath string) error {m.dirPath = dirPathm.items = nilif err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {if err != nil {if info == nil {return filepath.SkipDir}}name := info.Name()if path == dirPath || shouldExclude(name) {return nil}item := &FileInfo{Name:     name,Size:     info.Size(),Modified: info.ModTime(),}m.items = append(m.items, item)if info.IsDir() {return filepath.SkipDir}return nil}); err != nil {return err}m.PublishRowsReset()return nil
}func (m *FileInfoModel) Image(row int) interface{} {return filepath.Join(m.dirPath, m.items[row].Name)
}func shouldExclude(name string) bool {switch name {case "System Volume Information", "pagefile.sys", "swapfile.sys":return true}return false
}func main() {var mainWindow *walk.MainWindowvar splitter *walk.Splittervar treeView *walk.TreeViewvar tableView *walk.TableViewvar webView *walk.WebViewtreeModel, err := NewDirectoryTreeModel()if err != nil {log.Fatal(err)}tableModel := NewFileInfoModel()if err := (MainWindow{AssignTo: &mainWindow,Title:    "Walk File Browser Example",MinSize:  Size{600, 400},Size:     Size{1024, 640},Layout:   HBox{MarginsZero: true},Children: []Widget{HSplitter{AssignTo: &splitter,Children: []Widget{TreeView{AssignTo: &treeView,Model:    treeModel,OnCurrentItemChanged: func() {dir := treeView.CurrentItem().(*Directory)if err := tableModel.SetDirPath(dir.Path()); err != nil {walk.MsgBox(mainWindow,"Error",err.Error(),walk.MsgBoxOK|walk.MsgBoxIconError)}},},TableView{AssignTo:      &tableView,StretchFactor: 2,Columns: []TableViewColumn{TableViewColumn{DataMember: "Name",Width:      192,},TableViewColumn{DataMember: "Size",Format:     "%d",Alignment:  AlignFar,Width:      64,},TableViewColumn{DataMember: "Modified",Format:     "2006-01-02 15:04:05",Width:      120,},},Model: tableModel,OnCurrentIndexChanged: func() {var url stringif index := tableView.CurrentIndex(); index > -1 {name := tableModel.items[index].Namedir := treeView.CurrentItem().(*Directory)url = filepath.Join(dir.Path(), name)}webView.SetURL(url)},},WebView{AssignTo:      &webView,StretchFactor: 2,},},},},}.Create()); err != nil {log.Fatal(err)}splitter.SetFixed(treeView, true)splitter.SetFixed(tableView, true)mainWindow.Run()
}

Go GUI---lxn/walk 自带demo学习---7.文件浏览器相关推荐

  1. Go GUI---lxn/walk 自带demo学习---16.notifyicon通知图标

    简单说明:通知图标demo,原文都有注释,很好理解 需要一个walk.MainWindow 或一个walk.Dialog用于他们的消息循环.但是本例中让MainWindow 不可见. 创建通知图标,并 ...

  2. AutoJs学习-实现文件浏览器

    往期文章分享 点击跳转=><导航贴>- Unity手册,系统实战学习 点击跳转=><导航贴>- Android手册,重温移动开发

  3. Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来

    Py:python利用easygui实现最简单GUI带你学习区块链技术的发展和由来 目录 输出结果 实现代码 输出结果 实现代码 # -*- coding: utf-8 -*- ''' Created ...

  4. Go实战--使用golang开发Windows Gui桌面程序(lxn/walk)

    生命不止,继续 go go go!!! golang官方并没有提供Windows gui库,但是今天还是要跟大家分享一下使用golang开发Windows桌面程序,当然又是面向github编程了. 知 ...

  5. RPG游戏Demo学习笔记一

    导航 RPG游戏Demo学习笔记一 UE笔记 -- 一个简单的AI_weixin_52918492的博客-CSDN博客 目录 一.准备资源 二.基础功能 生命值与能量值 创建Widget Bluepr ...

  6. 微信语音idk的demo学习

    微信语音idk的demo学习 1. if ([[[UIDevice currentDevice]systemVersion]floatValue]>=7) { NSLog(@"%f&q ...

  7. 通过demo学习OpenStack开发——单元测试

    本文将进入单元测试的部分,这也是基础知识中最后一个大块.本文将重点讲述Python和OpenStack中的单元测试的生态环境. 通过demo学习OpenStack开发--单元测试\ 单元测试的重要性\ ...

  8. android vlayout 阿里,带你学习阿里巴巴的开源库VLayout

    原标题:带你学习阿里巴巴的开源库VLayout 今日科技快讯 14日,京东在总部召开"京东游戏泛娱乐产业联盟发布会",宣布完成对原LPL(英雄联盟职业联赛)队伍QG战队及LSPL( ...

  9. 如何用excle制作黑人拉馆_家居DIY带你学习如何用塑料勺制作壁挂!

    「家居DIY」带你学习如何用塑料勺制作壁挂! DIY生活馆图片展示内容介绍 传承手工艺术,放飞指尖梦想,每一节教学我们都会认真对待!只为传递手工技艺,动手实践能够让生活更美好,它让这一平淡的生活眼前一 ...

最新文章

  1. 配置中心Apollo的设计原理
  2. Map中的key,value null取值
  3. PostgreSQL-JDBC疑似bug:部分接口参数的表名、列名必须全部小写
  4. Vue中的前后台交互
  5. 深度学习概述:从感知机到深度网络
  6. python 全部缩进一行_Python(48)语言参考2:词法分析
  7. 详解三种主流分布式事务方案的优劣
  8. 论坛一大早白屏,无法访问
  9. Node.js 根本没有这样搞性能优化的?
  10. IIS PHP MYSQL出现问题,IIS 运行PHP 正常使用MYSQL 解决报错0x000000ff
  11. unity三维向量变化为角度_三维旋转
  12. 嘉楠发布阿瓦隆浸入式冷却矿机A1066I
  13. stm32f407 spi3 mosi没有输出_入门篇 | STM32F407寄存器开发点灯
  14. replaceFirst、replaceAll、replace区别
  15. EF之通过不同条件查找去重复
  16. 静态NAT、动态NAT、PAT(端口多路复用)的配置
  17. 计算机数据处理规模大小分为,计算机组成原理题集样稿.doc
  18. 从源码角度探索 Mybatis 插件注册方式
  19. 判断是否为字母 ctype
  20. 数学脱式计算在线计算机,四年级数学脱式计算练习400题

热门文章

  1. 【模型加速】PointPillars模型TensorRT加速实验(5)
  2. 北方工业大学计算机专硕分数线,北方工业大学法硕:近三年分数线汇总,一分钟速了解详细...
  3. debian10安装docker
  4. EduCoder-Linux与Python编程2021(顺序与选择结构)
  5. I/O复用:select、poll和epoll函数
  6. 云梦四时歌如何在电脑上玩 云梦四时歌模拟器教程
  7. 少女枪战怎么用电脑玩 少女枪战模拟器玩法教程
  8. 暴风播酷云二期J3455 DS918 1.04b引导6.23完美群晖教程,可硬洗,正常开关机、WOL
  9. Too many files with unapproved license异常、使用-Drat.skip=true跳过 或者 对没有授权的文件开头添加授权
  10. javascript动画制作