- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚开始研究 Go 和 Fyne。使用从示例中获得的信息编写测试 CRUD 程序后,我需要解决以下问题:
{"Given Names:", arwWidgets[I_NDX_GIVEN]},
go vet shows:
ERROR: "unknown field 'Key' in struct literal of type widget.FormItem",
however, if I include a key, compiler fails.
package main
// Dependency: local directory "data".
import (
"errors"
"io/ioutil"
"log"
"os"
"strings"
"fyne.io/fyne"
"fyne.io/fyne/app"
"fyne.io/fyne/dialog"
"fyne.io/fyne/layout"
"fyne.io/fyne/widget"
)
const BY_SEP byte = byte('|')
const I_ARRAY_LEN int = 10
const I_NDX_GIVEN int = 0
const I_NDX_FAMILY int = 1
const I_NDX_TITLE int = 2
const I_NDX_ADDR1 int = 3
const I_NDX_ADDR2 int = 4
const I_NDX_ADDR3 int = 5
const I_NDX_STATE int = 6
const I_NDX_ZIP int = 7
const I_NDX_TELE1 int = 8
const I_NDX_TELE2 int = 9
var _arsOldData [I_ARRAY_LEN]string
var _arsNewData [I_ARRAY_LEN]string
var _tfDataHasChanged bool
var _sKey string
var _arwEntryWidgets [I_ARRAY_LEN]*widget.Entry
var _wApp fyne.App
var _wWindow fyne.Window
var _wModal widget.PopUp
var _wFormKeyEntry widget.Form
//-------------------------------------------------------------------------------
func main() {
log.Println("In fytest01")
_, err := os.Stat("./data/")
if err != nil {
log.Println("You need to create directory: 'data'")
os.Exit(1)
}
//fnReadData()
_wApp := app.New()
_wWindow := _wApp.NewWindow("Customer Details")
//_wFormKeyEntry := fnCreateKeyForm()
wFormMain := fnCreateMainForm()
//_wModal := widget.NewModalPopUp(_wFormKeyEntry, _wWindow.Canvas())
_wWindow.Resize(fyne.NewSize(500, 400))
_wWindow.CenterOnScreen()
_wWindow.SetContent(widget.NewVBox(
wFormMain,
widget.NewGroup("",
fyne.NewContainerWithLayout(layout.NewGridLayout(2),
widget.NewButton("Exit", func() {
_wApp.Quit()
}),
widget.NewButton("Submit", func() {
log.Println("Submit button pressed")
err := fnUpdateData()
if err == nil {
dialog.ShowInformation("Information", "Data was updated", _wWindow)
wEntryForKey := widget.NewEntry()
wEntryForKey.SetPlaceHolder("Enter Key (4) : ")
wEntryForKey.OnChanged = func(sKey string) {
log.Println("Entered", sKey)
if len(sKey) == 4 {
_sKey = sKey
}
if len(_sKey) == 4 {
dialog.ShowInformation("Information", "Key "+_sKey+" has been entered - press OK", _wWindow)
fnReadData()
fnRefreshWidgetData()
}
}
dialog.ShowCustom("Enter Customer Key", "OK", wEntryForKey, _wWindow)
} else {
dialog.ShowError(err, _wWindow)
}
}),
))),
)
//fnShowKeyEntryDialog()
wEntryForKey := widget.NewEntry()
wEntryForKey.SetPlaceHolder("Enter Key (4) : ")
wEntryForKey.OnChanged = func(sKey string) {
log.Println("Entered", sKey)
if len(sKey) == 4 {
_sKey = sKey
}
if len(_sKey) == 4 {
dialog.ShowInformation("Information", "Key "+_sKey+" has been entered - press OK", _wWindow)
fnReadData()
fnRefreshWidgetData()
}
}
dialog.ShowCustom("Enter Customer Key", "OK", wEntryForKey, _wWindow)
_wWindow.ShowAndRun()
//_wModal.Show()
}
//-------------------------------------------------------------------------------
func fnCreateAllEntryWidgets() {
_arwEntryWidgets[I_NDX_GIVEN] = fnCreateSingleEntryWidget(I_NDX_GIVEN)
_arwEntryWidgets[I_NDX_FAMILY] = fnCreateSingleEntryWidget(I_NDX_FAMILY)
_arwEntryWidgets[I_NDX_TITLE] = fnCreateSingleEntryWidget(I_NDX_TITLE)
_arwEntryWidgets[I_NDX_ADDR1] = fnCreateSingleEntryWidget(I_NDX_ADDR1)
_arwEntryWidgets[I_NDX_ADDR2] = fnCreateSingleEntryWidget(I_NDX_ADDR2)
_arwEntryWidgets[I_NDX_ADDR3] = fnCreateSingleEntryWidget(I_NDX_ADDR3)
_arwEntryWidgets[I_NDX_STATE] = fnCreateSingleEntryWidget(I_NDX_STATE)
_arwEntryWidgets[I_NDX_ZIP] = fnCreateSingleEntryWidget(I_NDX_ZIP)
_arwEntryWidgets[I_NDX_TELE1] = fnCreateSingleEntryWidget(I_NDX_TELE1)
_arwEntryWidgets[I_NDX_TELE2] = fnCreateSingleEntryWidget(I_NDX_TELE2)
}
//-------------------------------------------------------------------------------
func fnCreateSingleEntryWidget(iNdxData int) *widget.Entry {
wEntry := widget.NewEntry()
wEntry.SetText(_arsOldData[iNdxData])
wEntry.OnChanged = func(sText string) {
_arsNewData[iNdxData] = sText
fnCheckIfDataHasChanged()
}
return wEntry
}
//-------------------------------------------------------------------------------
func fnCreateFormFields(arwWidgets [I_ARRAY_LEN]*widget.Entry) []*widget.FormItem {
return []*widget.FormItem{
{"Given Names:", arwWidgets[I_NDX_GIVEN]},
{"Family Name: ", arwWidgets[I_NDX_FAMILY]},
{"Title: ", arwWidgets[I_NDX_TITLE]},
{"Address Ln 1: ", arwWidgets[I_NDX_ADDR1]},
{" '' Ln 2: ", arwWidgets[I_NDX_ADDR2]},
{" '' Ln 3: ", arwWidgets[I_NDX_ADDR3]},
{" '' State ", arwWidgets[I_NDX_STATE]},
{" '' Zip: ", arwWidgets[I_NDX_ZIP]},
{"Telephone 1: ", arwWidgets[I_NDX_TELE1]},
{"Telephone 2: ", arwWidgets[I_NDX_TELE2]},
}
}
//-------------------------------------------------------------------------------
func fnCheckIfDataHasChanged() {
var tfChanged bool = false
for iNdxData := 0; !tfChanged && iNdxData < len(_arsOldData); iNdxData++ {
tfChanged = (_arsNewData[iNdxData] != _arsOldData[iNdxData])
}
if tfChanged != _tfDataHasChanged {
_tfDataHasChanged = tfChanged
if tfChanged {
// COULD NOT CREATE _wBtnSubmitMain AS A GLOBAL VARIABLE.
//_wBtnSubmitMain.Show()
//_wBtnSubmitMain.Enable()
} else {
//_wBtnSubmitMain.Disable()
//_wBtnSubmitMain.Hide()
}
}
}
//-------------------------------------------------------------------------------
func fnReadData() {
_tfDataHasChanged = false
log.Println("fnReadData: Key = " + _sKey)
var sData string
if len(_sKey) > 0 {
arbData, _ := ioutil.ReadFile("./data/" + _sKey)
if arbData != nil {
sData = string(arbData)
}
}
log.Println("fnReadData: sData = " + sData)
/* CLEAR OLD DATA */
for iNdxData := 0; iNdxData < I_ARRAY_LEN; iNdxData++ {
_arsOldData[iNdxData] = ""
}
/* POPULATE DATA IF ANY */
var iNdx1 int = 0
var iNdxData int = 0
var iLen int = len(sData)
for iNdx2 := 0; iNdx2 < len(sData); iNdx2++ {
if sData[iNdx2] == BY_SEP {
_arsOldData[iNdxData] = sData[iNdx1:iNdx2]
iNdx1 = iNdx2 + 1
iNdxData++
} else if iNdx2 == (iLen - 1) {
_arsOldData[iNdxData] = sData[iNdx1 : iNdx2+1]
}
}
for iNdx := 0; iNdx < I_ARRAY_LEN; iNdx++ {
_arsNewData[iNdx] = _arsOldData[iNdx]
}
}
//-------------------------------------------------------------------------------
func fnUpdateData() error {
if !_tfDataHasChanged {
return errors.New("Data has not changed")
}
if len(_sKey) < 1 {
_sKey = "9999"
//dialog.ShowInformation("Information", "Default key of 9999 was used", _wWindow) // CAUSES ERROR
}
var sNewData string = ""
for iNdxData, sVal := range _arsNewData {
if strings.Index(sVal, "|") >= 0 {
sVal = strings.ReplaceAll(sVal, "|", ":")
}
if iNdxData != I_ARRAY_LEN-1 {
sNewData += sVal + string(BY_SEP)
} else {
sNewData += sVal
}
}
log.Println("New Data = " + sNewData)
var err error = ioutil.WriteFile("./data/"+_sKey, []byte(sNewData), 0644)
if err == nil {
for iNdxData := 0; iNdxData < len(_arsNewData); iNdxData++ {
_arsOldData[iNdxData] = _arsNewData[iNdxData]
}
fnCheckIfDataHasChanged()
}
return err
}
//-------------------------------------------------------------------------------
func fnCreateKeyForm() *widget.Form {
wEntryKey := widget.NewEntry()
return &widget.Form{
Items: []*widget.FormItem{
{"Key:", wEntryKey}},
OnSubmit: func() {
_sKey = wEntryKey.Text
log.Println("Key = " + _sKey)
fnReadData()
log.Println("Data has been read")
fnRefreshWidgetData()
_wFormKeyEntry.Hide()
//_wModal.Hide()
},
}
}
//-------------------------------------------------------------------------------
//func fnCreateMainWindow() {
// log.Println("Creating Main Window Form")
// wFormMain := fnCreateMainForm()
// log.Println("Creating Main Window Window")
// _wWindow.SetContent( //widget.NewVBox(
// wFormMain,
// )
//}
//-------------------------------------------------------------------------------
func fnCreateMainForm() *widget.Form {
log.Println("Create form1 widgets")
fnCreateAllEntryWidgets()
log.Println("Create form1 FormFields")
arwFormFields := fnCreateFormFields(_arwEntryWidgets)
log.Println("Creating Form1")
return &widget.Form{
Items: arwFormFields,
}
}
//-------------------------------------------------------------------------------
func fnRefreshWidgetData() {
for iNdx := 0; iNdx < I_ARRAY_LEN; iNdx++ {
_arwEntryWidgets[iNdx].SetText(_arsNewData[iNdx])
}
}
最佳答案
SetContent
来创建它。 .您需要将其保存在一个变量中,以便您可以在某个时候调用 Disable()
在上面。 submitButton := widget.NewButton("Submit", func() {
log.Println("Submit button pressed")
...
})
_wWindow.SetContent(widget.NewVBox(
wFormMain,
widget.NewGroup("",
fyne.NewContainerWithLayout(layout.NewGridLayout(2),
widget.NewButton("Exit", func() {
_wApp.Quit()
}),
submitButton,
))),
)
...
if dataChanged {
submitButton.Enable()
} else {
submitButton.Disable()
}
go vet
消息是说您应该命名结构文字中的所有字段(尽管我使用 Go 1.13 收到了不同的消息)。 Go 允许您按顺序或按名称添加值 - go vet
告诉你按名称更安全(例如,如果字段被移动或插入到 FormItem
结构,那么你的代码将被破坏)。 return []*widget.FormItem{
{ Text: "Given Names:", Widget: arwWidgets[I_NDX_GIVEN]},
...
关于Go and Fyne - 需要对话框响应并启用/禁用提交按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594776/
我还没有找到任何使用 fyne GUI 工具包创建启动画面的小部件。我在桌面驱动程序界面中找到了一种启动画面的方法,但不知道如何使用它? 谁能让我理解这一点,如何在 fyne GUI 中创建启动画面?
我正在尝试在 listwithdata 小部件中显示字母表。我使用自定义可点击标签作为小部件显示在列表中。 出于某种原因,当小部件加载时,一切都显示正常。但是当我开始滚动时,字母开始以完全随机的顺序显
刚开始研究 Go 和 Fyne。使用从示例中获得的信息编写测试 CRUD 程序后,我需要解决以下问题: 我需要一个初始对话框或类似的,以便允许选择现有记录或"new"来指示新记录。我现有的对话框不能充
(这里有很多新细节。) 我正在尝试(非常努力地)扩展 Fyne 的一些小部件的功能。基本上我需要实现或“覆盖”右键单击选择、按钮、编辑等内容。我还需要对其他一些行为进行细微更改。 我尝试以各种方式扩展
下面的代码创建了一个新的应用程序窗口来显示本地文件系统中的图片,我如何添加支持来检测“按键”事件并退出应用程序? package main import ( "flag" _ "ima
我可以使用 FYNE_THEME=light 运行我的 Fyne 应用程序以使其使用浅色背景,并且在没有此 var 的情况下运行它将默认为 dark。有没有办法扭转这种行为?让应用程序默认以浅色主题启
我可以使用 FYNE_THEME=light 运行我的 Fyne 应用程序以使其使用浅色背景,并且在没有此 var 的情况下运行它将默认为 dark。有没有办法扭转这种行为?让应用程序默认以浅色主题启
我只是无法配置 GUI fyne-io . go get fyne.io/fyne 出错了 package fyne.io/fyne: unrecognized import path "fyne.i
下面是我使用 fyne 工具包实现的 UI 的示例应用程序代码,但无法弄清楚如何将按钮向左对齐、使顶部文本变大以及添加颜色. 我尝试创建一个自定义主题来实现我需要的 UI 功能,但我对 fyne 工具
我想向我用 Go 编写的命令行应用程序添加 GUI,但我遇到了 fyne 和循环依赖项的问题。 考虑这个简单的例子来说明我面临的问题:假设一个按钮触发我的模型类上的一个耗时的方法(比如获取数据等),并
我想向我用 Go 编写的命令行应用程序添加 GUI,但我遇到了 fyne 和循环依赖项的问题。 考虑这个简单的例子来说明我面临的问题:假设一个按钮触发我的模型类上的一个耗时的方法(比如获取数据等),并
我想在一个自定义小部件中组合一些标准小部件。如果将所有小部件字段放入一个容器中,我可以这样做: package main import ( "fmt" "fyne.io/fyne"
我想要用于布局小部件的扩展和拉伸(stretch)框,以便我的应用程序如下所示: IE。顶部和中间的盒子在两个方向上都很长。 我尝试将此代码与 Box 一起使用(因为我没有在 documentatio
我正在开发需要动态添加和删除 gui 元素的 GUI 应用程序,我想知道是否有办法从 golang fyne 容器中删除元素。在下面的示例代码中,我创建了容器并动态添加元素,现在我希望也能够删除这些元
我有一个数据项集合,我正在尝试使用 Fyne 将一个 GUI 放在一起来编辑该集合。我已经想出如何使用绑定(bind)来显示集合,但我不知道如何才能编辑这些项目。 这是我所拥有的稍微简化的版本: ty
我正在检查使用 Web Assembly 在浏览器中使用 fyne 的可能性,但我收到错误... 主要Go: package main import ( "fyne.io/fyne/v2/ap
我正在检查使用 Web Assembly 在浏览器中使用 fyne 的可能性,但我收到错误... 主要Go: package main import ( "fyne.io/fyne/v2/ap
我无法从在 android 上运行的 Go fyne 应用程序发出 http 请求,下面是一个简单的例子来说明这个问题 package main import ( "io/ioutil"
这个问题更多是关于围棋而不是 Fyne。扩展 Fyne 的 Entry 小部件是规定的方式,我想检测何时按下 Enter(Return)并将其用作我需要对 Entry 内容采取行动的信号。我希望 Sh
单击按钮时更改应用页面上的元素的最佳做法是什么。比如我有这样的代码 package main import ( "fyne.io/fyne/v2/app" "fyne.io/fyne/
我是一名优秀的程序员,十分优秀!