golang跨平台图形用户交互对话框插件库zenity的使用

Golang跨平台图形用户交互对话框插件库zenity的使用

简介

Zenity是一个为Golang提供的跨平台对话框库,支持Windows、macOS和其他Unix系统,提供类似Zenity的图形用户交互对话框功能。

安装

Go包安装

go get github.com/ncruces/zenity@latest

macOS/WSL使用Homebrew安装

brew install ncruces/tap/zenity

Windows使用Scoop安装

scoop install https://ncruces.github.io/scoop/zenity.json

使用Go安装zenity命令

go install github.com/ncruces/zenity/cmd/zenity@latest

支持的功能

  • 消息对话框(错误、信息、问题、警告)
  • 文本输入对话框
  • 列表对话框(简单)
  • 密码对话框
  • 文件选择对话框
  • 颜色选择对话框
  • 日历对话框
  • 进度对话框
  • 通知

使用示例

消息对话框示例

package main

import (
	"github.com/ncruces/zenity"
)

func main() {
	// 显示信息对话框
	err := zenity.Info("这是一个信息对话框",
		zenity.Title("信息"),
		zenity.InfoIcon)
	if err != nil {
		panic(err)
	}

	// 显示问题对话框
	ok, err := zenity.Question("你想继续吗?",
		zenity.Title("问题"),
		zenity.QuestionIcon)
	if err != nil {
		panic(err)
	}
	if ok {
		// 用户点击了"是"
	}
}

文本输入对话框示例

package main

import (
	"fmt"
	"github.com/ncruces/zenity"
)

func main() {
	// 获取用户输入
	input, err := zenity.Entry("请输入你的名字:",
		zenity.Title("输入对话框"),
		zenity.EntryText("默认值"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("你输入的是: %s\n", input)
}

文件选择对话框示例

package main

import (
	"fmt"
	"github.com/ncruces/zenity"
)

func main() {
	// 选择单个文件
	file, err := zenity.SelectFile(
		zenity.FileFilters{
			{"Go文件", []string{"*.go"}, true},
			{"所有文件", []string{"*"}, false},
		},
		zenity.Title("选择文件"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("选择的文件: %s\n", file)

	// 选择多个文件
	files, err := zenity.SelectFileMultiple(
		zenity.Title("选择多个文件"))
	if err != nil {
		panic(err)
	}
	fmt.Printf("选择的文件: %v\n", files)
}

进度对话框示例

package main

import (
	"time"
	"github.com/ncruces/zenity"
)

func main() {
	// 创建进度对话框
	progress, err := zenity.Progress(
		zenity.Title("进度条"),
		zenity.NoCancel())
	if err != nil {
		panic(err)
	}
	defer progress.Close()

	// 更新进度
	for i := 0; i <= 100; i++ {
		time.Sleep(100 * time.Millisecond)
		progress.Text(fmt.Sprintf("已完成 %d%%", i))
		progress.Value(i)
	}
	progress.Complete()
}

特点

Go包的优点:

  • 不需要cgo(有利于交叉编译)
  • 不需要主循环(或其他线程或初始化要求)
  • 通过context支持取消操作
  • Windows上:
    • 无额外依赖
    • 支持Unicode
    • 支持高DPI
    • 支持WSL/Cygwin/MSYS2
  • macOS上:
    • 唯一依赖是osascript
  • 其他Unix系统:
    • 包装了zenity、matedialog或qarma

注意事项

在不同平台(Windows、macOS和其他Unix系统)上的行为可能略有不同。有些是平台差异导致的,有些则是限制导致的。


更多关于golang跨平台图形用户交互对话框插件库zenity的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang跨平台图形用户交互对话框插件库zenity的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang跨平台图形用户交互对话框库Zenity使用指南

Zenity是一个Go语言实现的跨平台对话框库,它提供了简单易用的API来创建各种图形用户交互对话框,如消息框、文件选择框、输入框等。Zenity支持Windows、macOS和Linux三大主流操作系统。

安装

go get github.com/ncruces/zenity

基本使用示例

1. 消息对话框

package main

import (
	"github.com/ncruces/zenity"
)

func main() {
	// 信息提示框
	err := zenity.Info("操作已完成!",
		zenity.Title("提示"),
		zenity.InfoIcon)
	if err != nil {
		panic(err)
	}

	// 错误提示框
	err = zenity.Error("操作失败!",
		zenity.Title("错误"),
		zenity.ErrorIcon)
	if err != nil {
		panic(err)
	}

	// 警告提示框
	err = zenity.Warning("确定要删除此文件吗?",
		zenity.Title("警告"),
		zenity.WarningIcon)
	if err != nil {
		panic(err)
	}
}

2. 确认对话框

func confirmDialog() {
	ok, err := zenity.Question("确定要退出程序吗?",
		zenity.Title("确认"),
		zenity.OKLabel("是"),
		zenity.CancelLabel("否"))
	if err != nil {
		panic(err)
	}
	
	if ok {
		fmt.Println("用户选择了是")
	} else {
		fmt.Println("用户选择了否")
	}
}

3. 文件选择对话框

func fileDialog() {
	// 单个文件选择
	file, err := zenity.SelectFile(
		zenity.FileFilters{
			{"Go文件", []string{"*.go"}, true},
			{"文本文件", []string{"*.txt"}, false},
		},
		zenity.Title("选择文件"))
	if err != nil {
		panic(err)
	}
	fmt.Println("选择的文件:", file)

	// 多个文件选择
	files, err := zenity.SelectFileMultiple(
		zenity.Title("选择多个文件"))
	if err != nil {
		panic(err)
	}
	fmt.Println("选择的多个文件:", files)

	// 保存文件对话框
	saveFile, err := zenity.SelectFileSave(
		zenity.Title("保存文件"),
		zenity.ConfirmOverwrite())
	if err != nil {
		panic(err)
	}
	fmt.Println("保存到:", saveFile)
}

4. 目录选择对话框

func directoryDialog() {
	dir, err := zenity.SelectDirectory(
		zenity.Title("选择目录"))
	if err != nil {
		panic(err)
	}
	fmt.Println("选择的目录:", dir)
}

5. 输入对话框

func inputDialog() {
	// 单行输入
	name, err := zenity.Entry("请输入您的姓名:",
		zenity.Title("输入"),
		zenity.DefaultText("张三"))
	if err != nil {
		panic(err)
	}
	fmt.Println("输入的姓名:", name)

	// 密码输入
	password, err := zenity.Password(
		zenity.Title("密码输入"))
	if err != nil {
		panic(err)
	}
	fmt.Println("输入的密码:", password)
}

6. 进度条对话框

func progressDialog() {
	progress, err := zenity.Progress(
		zenity.Title("进度"),
		zenity.MaxValue(100))
	if err != nil {
		panic(err)
	}
	defer progress.Close()

	for i := 0; i <= 100; i++ {
		progress.Text(fmt.Sprintf("处理中... %d%%", i))
		progress.Value(i)
		time.Sleep(100 * time.Millisecond)
	}
}

7. 列表选择对话框

func listDialog() {
	items := []string{"选项1", "选项2", "选项3"}
	
	// 单选
	selected, err := zenity.List("请选择一个选项:",
		items,
		zenity.Title("单选"),
		zenity.DisallowEmpty())
	if err != nil {
		panic(err)
	}
	fmt.Println("选择的选项:", selected)

	// 多选
	multiSelected, err := zenity.ListMultiple("请选择多个选项:",
		items,
		zenity.Title("多选"))
	if err != nil {
		panic(err)
	}
	fmt.Println("选择的多个选项:", multiSelected)
}

高级选项

Zenity提供了许多选项来自定义对话框行为:

// 设置对话框图标
zenity.Icon("/path/to/icon.png")

// 设置对话框超时
zenity.Timeout(10 * time.Second)

// 设置对话框宽度和高度
zenity.Width(400)
zenity.Height(300)

// 设置对话框位置
zenity.Attach(1234) // 窗口ID

跨平台注意事项

  1. 在Linux上,Zenity依赖于zenitykdialogmatedialog等命令行工具
  2. 在macOS上,使用原生AppleScript实现
  3. 在Windows上,使用Win32 API实现

总结

Zenity为Go开发者提供了一个简单统一的API来创建跨平台的图形用户交互对话框。它的主要特点包括:

  • 支持多种对话框类型
  • 跨平台兼容性
  • 简单易用的API
  • 丰富的自定义选项

通过使用Zenity,开发者可以轻松地为命令行程序添加基本的GUI交互功能,而无需引入复杂的GUI框架。

回到顶部