在Tcl Tk GUI中隐藏和显示框架

5

我希望制作一个可以交替隐藏和显示的框架。问题是Tk没有提供任何隐藏/取消隐藏命令。我使用vtcl,其中有一个“窗口隐藏”选项,它只隐藏顶层窗口。现在我想隐藏一个框架,然后再次显示相同的框架。可以将其视为取消隐藏一个框架并显示另一个框架。我的代码可能如下:

proc show1hide2 { } {
    global i top
    if {$i == 1} {
        unpack $top.frame1
        pack $top.frame2
        set i 0
    } else {
        unpack $top.frame2
        pack $top.frame1
        set i 1
    }
}

在这个过程中,$top.frame1$top.frame2已经填充,并且$i的值被切换,因此当调用此过程时,$top.frame1$top.frame2会交替显示。我想知道是否存在像unpack这样的命令可以帮助我做到这一点?顺便说一句,unpack只是一个想法。

似乎还有另一种解决方案,使用“堆叠帧”和raise命令(我还没有尝试过)。优点可能是,如果两个框架具有不同的大小并且使用布局管理器(例如grid),则窗口不会收缩或增长(调整大小):https://dev59.com/NnjZa4cB1Zd3GeqPZAml - R Yoda
1个回答

9
我认为 pack forget 命令可能是你要找的内容:
proc toggle {} {
    global state
    if {$state == 1} {
        pack forget .r
        pack .g   -side bottom -fill x
        set state 0
    } else {
        pack forget .g
        pack .r   -side bottom -fill x

        set state 1
    }
}

set state 1

# Make the widgets
label .r -text "Red Widget"    -bg red
label .g -text "Green Widget" -bg green
button .tog -text "Toggle" -command toggle
# Lay them out
pack .tog
pack .r   -side bottom -fill x

+1:您可以使用pack info在调用之间获取有关打包窗口的信息以便恢复正常工作。另一种选择是使用grid,它具有grid removegrid forget,我认为您可以配置ttk::notebook小部件以不具有选项卡,并使用适当的样式(这在小部件布局方面具有一些优势)。遗憾的是,样式黑客仍然比应该更深入地进行了解。 :-( - Donal Fellows
很棒的代码!我只是想知道在两个pack命令之间窗口是否会收缩和扩展(或者仅在第二个pack命令后根据需要调整大小)。结果:没有收缩和再次扩展,只有在命令处理程序“toggle”完成后进行一次窗口大小调整。我通过在两个pack命令之间插入after 1000(等待一秒钟)来测试这一点。我的解释是:Tcl/Tk是单线程的,必须等到函数执行结束才能继续执行。 - R Yoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接