Go语言GUI程序闪退问题分析:如何解决证书下载配置界面一闪而过
这段代码创建了一个简单的GUI界面,包含一个LineEdit和一个PushButton。当点击PushButton时,会从'http://mitm.it/cert/p12'下载证书并将编号写入配置文件。具体分析如下:
-
首先定义了两个变量entry和mainWindow,分别代表LineEdit和MainWindow。
-
downloadFile函数用于下载文件。首先创建了一个文件,然后发送请求并下载文件,最后将文件写入磁盘。如果有错误发生,则返回该错误。
-
writeIni函数用于将编号写入配置文件。首先获取用户目录,然后在该目录下创建配置文件HC.ini。写入'[general]'标签后返回。
-
main函数首先创建了一个GUI界面。在该界面中包含一个LineEdit和一个PushButton。当点击PushButton时,会先获取LineEdit的内容,如果为空则提示错误信息。否则会调用downloadFile函数下载证书,并调用writeIni函数将编号写入配置文件。最后提示设置完成信息。
-
在MainWindow的OnSizeChanged事件中,将窗口隐藏,这样可以避免闪一下就消失的现象。
总体来说,这段代码实现了一个简单的GUI界面,用于下载证书并将编号写入配置文件。但是由于没有给出任何交互提示,所以在运行时会一闪而过,导致无法输入编号。
解决方法:
代码中将窗口隐藏,导致程序运行后立即退出。为了避免闪退,需要将 mainWindow.Hide() 删除,并确保在程序执行完所有操作后,才结束主循环。
package main
import (
"fmt"
"github.com/gen2brain/dlgs"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
"io"
"net/http"
"os"
"path/filepath"
)
func downloadFile(url string, filepath string) error {
// 创建文件
out, err := os.Create(filepath)
if err != nil {
return err
}
defer out.Close()
// 发送请求并下载文件
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
// 写入文件
_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}
return nil
}
func writeIni(name string) error {
// 获取用户目录
userDir, err := os.UserHomeDir()
if err != nil {
return err
}
// 获取配置文件路径
iniPath := filepath.Join(userDir, "HC.ini")
// 创建配置文件
f, err := os.Create(iniPath)
if err != nil {
return err
}
defer f.Close()
// 写入配置
_, err = f.WriteString("[general]
")
if err != nil {
return err
}
return nil
}
func main() {
var (
entry *walk.LineEdit
mainWindow *walk.MainWindow
)
// 创建GUI界面
MainWindow{
AssignTo: &mainWindow,
Title: "证书下载和配置",
MinSize: Size{Width: 300, Height: 100},
Layout: VBox{},
Children: []Widget{
LineEdit{
AssignTo: &entry,
},
PushButton{
Text: "下载证书并写入配置",
OnClicked: func() {
// 获取编辑框内容
entryText := entry.Text()
// 如果编辑框内容为空,则提示错误信息
if entryText == "" {
dlgs.Error("错误", "请输入编号")
return
}
// 下载证书
filepath := filepath.Join(os.Getenv("USERPROFILE"), "Desktop", "mitmproxy-ca-cert.p12")
err := downloadFile("http://mitm.it/cert/p12", filepath)
if err != nil {
dlgs.Error("错误", fmt.Sprintf("下载证书失败: %v", err))
return
}
// 写入配置文件
err = writeIni(entryText)
if err != nil {
dlgs.Error("错误", fmt.Sprintf("写入配置文件失败: %v", err))
return
}
// 提示设置完成信息
dlgs.Info("信息", "设置完成,证书已下载到桌面请手动安装")
},
},
},
// 删除 OnSizeChanged 事件
// OnSizeChanged: func() {
// mainWindow.Hide()
// },
}.Run()
}
这段代码已经删除了 mainWindow.Hide() 事件,这样窗口就不会被立即隐藏,程序就可以正常执行并等待用户输入编号。
补充:
为了让程序更友好,可以考虑添加以下功能:
- 在LineEdit中添加占位符文字,提示用户输入编号。
- 在PushButton按下时,显示一个进度条,指示证书下载进度。
- 在程序运行结束后,自动关闭窗口。
希望以上分析和解决方案能够帮助您解决程序闪退问题。
原文地址: https://www.cveoy.top/t/topic/nRQB 著作权归作者所有。请勿转载和采集!