go fyne button Disable()与Enable()

Liz8202 · 2023-09-05 14:37:11 · 2596 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-09-05 14:37:11 的主题,其中的信息可能已经有所发展或是发生改变。

期望目标:写了个fyne的小工具,想要实现的操作是点击某个按钮后该按钮不可用,等处理完相关逻辑后再将按钮变为可用(包括其他的选择框也在点击按钮后不可用),同时在按钮不可用期间所有按键事件丢失

现状:在按钮的OnTapped时间中先将各个组件Disable(),处理完成后再调用Enable()。但发现点击后周四只是将相关组件置灰,暂时没去操作,带处理完按钮的处理时间后会处理按钮变亮前的操作(比如在置灰的状态下继续点了按钮,看起来当时没有响应,但待OnTapped方法执行完成调用Enable()方法后,还是处理了置灰状态的操作,只是延迟处理了)。相关代码

buildButton.OnTapped = func() {
        if isInteTime() {
            jobName := GetJobNameByGroupNameAndServiceName(groupSelect.Selected,projectSelect.Selected)
            infoId := GetInfoIdByGroupNameAndServiceName(groupSelect.Selected,projectSelect.Selected)

            fmt.Println("###################jobName:" + jobName + "infoId:" + infoId + "################")
            //选择服务后操作
            if jobName != "" && infoId != "" {
                // fmt.Println("###################jobName:" + jobName + "infoId:" + infoId + "################")
                //根据infoId得到jenkins信息
                for _, groupJobInfo := range GroupJobInfos{
                    if groupJobInfo.InfoId == infoId {
                        //禁用按钮,选择
                        buildButton.Disable()
                        appSelect.Disable()
                        groupSelect.Disable()
                        projectSelect.Disable()
                        //执行构建
                        buildResult := utils.BuildJob(jobName,logLineEntry,groupJobInfo.JenkinsUrl,groupJobInfo.JenkinsUsername,groupJobInfo.JenkinsPassword)
                        //记录日志
                        writeLog(buildResult,projectSelect.Selected)
                        dialog.ShowInformation("提示",buildResult,win)
                        //启用按钮,选择
                        appSelect.Enable()
                        buildButton.Enable()
                        groupSelect.Enable()
                        projectSelect.Enable()
                        break
                    }
                }
            }else {
                dialog.ShowInformation("提示","请选择构建的服务",win)
            }
        }else {
            dialog.ShowInformation("提示","请非工作时间段使用",win)
        }    
    }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2596 次点击  
加入收藏 微博
2 回复  |  直到 2023-10-10 14:45:24
A117
A117 · #1 · 2年之前

首先,您的文字描述中有些别字,增加了阅读难度;其次,如果是能复现问题的最简代码片更好。 抛开您说的问题,您的实现恐怕不好:长时间操作不应该在事件处理函数中,这样恐怕会阻塞主线程。我建议在事件处理函数中只禁用按钮,然后通知另一个routine,在另一个routine中进行处理,再重新让按钮可用(fyne编程中,不用担心操作界面的代码不在主进程)。在处理函数中将其禁用后,在结束之前,恐怕界面来不及重绘。 另外,fyne有时有重绘异常,我都是调用Refresh()方法解决。

Liz8202
Liz8202 · #2 · 2年之前
A117A117 #1 回复

首先,您的文字描述中有些别字,增加了阅读难度;其次,如果是能复现问题的最简代码片更好。 抛开您说的问题,您的实现恐怕不好:长时间操作不应该在事件处理函数中,这样恐怕会阻塞主线程。我建议在事件处理函数中只禁用按钮,然后通知另一个routine,在另一个routine中进行处理,再重新让按钮可用(fyne编程中,不用担心操作界面的代码不在主进程)。在处理函数中将其禁用后,在结束之前,恐怕界面来不及重绘。 另外,fyne有时有重绘异常,我都是调用Refresh()方法解决。

忙其他事了一直没来回复,感谢哥们指点

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传