You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IUP中更新窗口显示后的布局?

问题:IUP-Go窗口显示后无法更新布局

我搞不懂窗口显示后该怎么更新布局,肯定漏了关键操作!以下是简化后的测试代码:切换到第二个标签页,点击toggle按钮,本应在第一个标签页中添加(随后移除)一行数据。selectedMarkets的值已经成功变更,但重建后的布局完全没显示出变化。

package main

import (
    "slices"

    "github.com/gen2brain/iup-go/iup"
)

type marketControls struct {
    mCVal string
}

var (
    selectedMarkets    = make(map[string]marketControls)
    dlg                iup.Ihandle
    marketValuesHandle iup.Ihandle
)

func main() {

    // Test value to show it is added to layout

    mC := new(marketControls)
    mC.mCVal = "woo"

    selectedMarkets["01"] = *mC

    iup.Open()
    defer iup.Close()

    marketValuesHandle = buildMarketPanel()

    dlg = iup.Dialog(
        iup.Hbox(
            iup.Tabs(
                marketValuesHandle,
                buildSelectionPanel(),
            ).SetAttributes("TABTITLE0=\"Market Values\",TABTITLE1=\"Market Selections\",MINSIZE=338x, MAXSIZE=340x"),
        ),
    ).SetAttributes("MARGIN=10x10")

    setSelectionsCallbacks()

    iup.Show(dlg)

    iup.MainLoop()

}

func buildMarketPanel() iup.Ihandle {

    gb := iup.GridBox().SetAttributes(map[string]string{
        "NUMDIV":        "2",
        "NORMALIZESIZE": "BOTH",
        "ORIENTATION":   "HORIZONTAL",
        "ALIGNMENTCOL":  "ACENTER",
        "MARGIN":        "10x10",
        "GAPLIN":        "20",
        "GAPCOL":        "10",
    })

    gb = fillMarketPanel(gb)

    return gb
}

func fillMarketPanel(gb iup.Ihandle) iup.Ihandle {

    gb = iup.Append(gb, iup.Label("Market").SetAttributes("FONTSTYLE=Bold"))
    gb = iup.Append(gb, iup.Label("Value").SetAttributes("FONTSTYLE=Bold"))

    var mCKeys []string

    for key := range selectedMarkets {
        mCKeys = append(mCKeys, key)
    }

    slices.Sort(mCKeys)

    for _, key := range mCKeys {
        gb = iup.Append(gb, iup.Label(key))

        marketVal := selectedMarkets[key].mCVal
        gb = iup.Append(gb, iup.Label(marketVal))
    }

    return gb
}

func buildSelectionPanel() iup.Ihandle {

    gb := iup.GridBox(

        iup.Label("Selections").SetAttributes("FONTSTYLE=Bold"),
        iup.Toggle("  Sel 00").SetHandle("sp00"),
    ).SetAttributes(map[string]string{
        "NUMDIV":         "1",
        "HOMOGENEOUSCOL": "Yes",
        "NORMALIZESIZE":  "BOTH",
        "ORIENTATION":    "HORIZONTAL",
        "ALIGNMENTLIN":   "ACENTER",
        "ALIGNMENTCOL":   "ACENTER",
        "MARGIN":         "10x10",
        "GAPLIN":         "10",
        "GAPCOL":         "10",
    })

    return gb
}

func setSelectionsCallbacks() {

    iup.SetCallback(iup.GetHandle("sp00"), "VALUECHANGED_CB", iup.ValueChangedFunc(changedSelection))
}

func changedSelection(ih iup.Ihandle) int {

    offOn := ih.GetAttribute("VALUE")

    if offOn == "ON" {

        mC := new(marketControls)
        mC.mCVal = ""

        selectedMarkets["00"] = *mC

    } else {

        delete(selectedMarkets, "00")

    }

    marketValuesHandle = buildMarketPanel()

    // Tried each of these

    iup.Redraw(marketValuesHandle, 1)
    iup.Update(marketValuesHandle)
    iup.Redraw(dlg, 1)
    iup.Update(dlg)

    return iup.DEFAULT
}
解决方案

在Antonio的建议下,我找到了修复方法,完整代码如下:

package main

import (
    "slices"

    "github.com/gen2brain/iup-go/iup"
)

type marketControls struct {
    mCVal string
}

var (
    selectedMarkets = make(map[string]marketControls)

    tabsHandle             iup.Ihandle
    marketValuesHandle     iup.Ihandle
    marketSelectionsHandle iup.Ihandle
)

func main() {

    // Test value to show it is added to layout

    mC := new(marketControls)
    mC.mCVal = "woo"

    selectedMarkets["01"] = *mC

    iup.Open()
    defer iup.Close()

    tabsHandle = iup.Tabs().SetAttributes("TABTITLE0=\"Market Values\",TABTITLE1=\"Market Selections\",MINSIZE=338x, MAXSIZE=340x")

    marketValuesHandle = buildMarketPanel()
    marketSelectionsHandle = buildSelectionPanel()

    tabsHandle = iup.Append(tabsHandle, marketValuesHandle)
    tabsHandle = iup.Append(tabsHandle, marketSelectionsHandle)

    dlg := iup.Dialog(
        iup.Hbox(
            tabsHandle,
        ),
    ).SetAttributes("MARGIN=10x10")

    setSelectionsCallbacks()

    iup.Show(dlg)

    iup.MainLoop()

}

func buildMarketPanel() iup.Ihandle {

    gb := iup.GridBox().SetAttributes(map[string]string{
        "NUMDIV":        "2",
        "NORMALIZESIZE": "BOTH",
        "ORIENTATION":   "HORIZONTAL",
        "ALIGNMENTCOL":  "ACENTER",
        "MARGIN":        "10x10",
        "GAPLIN":        "20",
        "GAPCOL":        "10",
    })

    gb = fillMarketPanel(gb)

    return gb
}

func fillMarketPanel(gb iup.Ihandle) iup.Ihandle {

    gb = iup.Append(gb, iup.Label("Market").SetAttributes("FONTSTYLE=Bold"))
    gb = iup.Append(gb, iup.Label("Value").SetAttributes("FONTSTYLE=Bold"))

    var mCKeys []string

    for key := range selectedMarkets {
        mCKeys = append(mCKeys, key)
    }

    slices.Sort(mCKeys)

    for _, key := range mCKeys {
        gb = iup.Append(gb, iup.Label(key))

        marketVal := selectedMarkets[key].mCVal
        gb = iup.Append(gb, iup.Label(marketVal))
    }

    return gb
}

func buildSelectionPanel() iup.Ihandle {

    gb := iup.GridBox(

        iup.Label("Selections").SetAttributes("FONTSTYLE=Bold"),
        iup.Toggle("  Sel 00").SetHandle("sp00"),
    ).SetAttributes(map[string]string{
        "NUMDIV":         "1",
        "HOMOGENEOUSCOL": "Yes",
        "NORMALIZESIZE":  "BOTH",
        "ORIENTATION":    "HORIZONTAL",
        "ALIGNMENTLIN":   "ACENTER",
        "ALIGNMENTCOL":   "ACENTER",
        "MARGIN":         "10x10",
        "GAPLIN":         "10",
        "GAPCOL":         "10",
    })

    return gb
}

func setSelectionsCallbacks() {

    iup.SetCallback(iup.GetHandle("sp00"), "VALUECHANGED_CB", iup.ValueChangedFunc(changedSelection))
}

func changedSelection(ih iup.Ihandle) int {

    offOn := ih.GetAttribute("VALUE")

    if offOn == "ON" {

        mC := new(marketControls)
        mC.mCVal = ""

        selectedMarkets["00"] = *mC

    } else {

        delete(selectedMarkets, "00")

    }

    iup.Unmap(marketValuesHandle)
    iup.Detach(marketValuesHandle)
    marketValuesHandle = buildMarketPanel()
    tabsHandle = iup.Insert(tabsHandle, marketSelectionsHandle, marketValuesHandle).SetAttributes("TABTITLE0=\"Market Values\",MINSIZE=338x, MAXSIZE=340x")
    iup.Map(marketValuesHandle)
    iup.Refresh(tabsHandle)

    return iup.DEFAULT
}

内容的提问来源于stack exchange,提问作者shakeshuck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:35:54