动态显示不同内容的好方法是什么(在Tcl/Tk中)?

动态显示不同内容的好方法是什么(在Tcl/Tk中)?,tcl,tk,Tcl,Tk,我有一组单选按钮(比如,选项1和2),需要根据用户的选择显示一些小部件。例如,如果他们选择1,我会向他们展示一个带有多个单选按钮的labelframe;然而,如果他们选择2,我会向他们展示一个带有一些按钮的labelframe。无论哪种情况,结果内容都将显示在窗口的同一区域中 在这样的多个小部件显示之间切换的好方法是什么 让我想到我应该使用窗格窗口和框架,但我不太明白如何在不同的内容之间切换。使用时,您应该能够通过删除框架并添加新框架来替换它,从而在内容窗格之间切换。有关ttk::panedwi

我有一组
单选按钮
(比如,选项1和2),需要根据用户的选择显示一些小部件。例如,如果他们选择1,我会向他们展示一个带有多个单选按钮的
labelframe
;然而,如果他们选择2,我会向他们展示一个带有一些按钮的
labelframe
。无论哪种情况,结果内容都将显示在窗口的同一区域中

在这样的多个小部件显示之间切换的好方法是什么

让我想到我应该使用
窗格窗口
框架
,但我不太明白如何在不同的内容之间切换。

使用时,您应该能够通过删除框架并添加新框架来替换它,从而在内容窗格之间切换。有关ttk::panedwindow的
忘记
添加
/
插入
命令的说明,请参阅

示例代码:

package require Ttk

# Create a panedwindow
ttk::frame .f
ttk::panedwindow .f.pane -orient vertical

# Create three panes
ttk::frame .f.pane.one -height 50 -width 50
ttk::label .f.pane.one.l -text "Number one"
pack .f.pane.one.l

ttk::frame .f.pane.two -height 50 -width 50
ttk::label .f.pane.two.l -text "Number two"
pack .f.pane.two.l

ttk::frame .f.pane.three -height 50 -width 50
ttk::label .f.pane.three.l -text "Number three"
pack .f.pane.three.l

# Add frames one and two to the panedwindow
.f.pane add .f.pane.one
.f.pane add .f.pane.two

pack .f.pane -expand 1 -fill both
pack .f -expand 1 -fill both

# Replace pane one with pane three
.f.pane insert 1 .f.pane.three
.f.pane forget 2 

您可以根据自己的需要修改此代码。只需创建您可能需要的所有视图,然后根据需要进行交换。

一个非常简单的方法是为每组数据使用一个帧。使用
grid
将它们全部放在同一行和同一列中。然后你所需要做的就是把框架和它的子对象提升到堆叠顺序的顶部


另一种技术开始时也一样,但不是使用raise,而是在当前显示的帧上执行
grid remove
,然后在要显示的帧上执行
grid
。使用
网格删除
grid
会记住所有设置,这样您就不必在下次希望它出现时再次指定所有选项。

将窗格的选择链接到单选按钮的最简单方法是在单选按钮的共享状态变量上使用write
trace
。@Donal我尝试过使用
trace
路线,但我的代码阻止了radiobutton的更改,并给了我一个错误。下面是代码(
demoChoice
是单选按钮变量):
set-inEvent 0跟踪变量demoChoice w{global-demoChoice-inEvent if($inEvent){return}set-inEvent 1.main.demoDetails.lbl-configure-text$demoChoice-set-inEvent 0}
@Pat:为跟踪回调使用一个过程。您需要使该过程以
args
作为其参数列表;跟踪回调会附加额外的参数。我并不需要多个窗口和一个窗格,但在一个窗格中使用的技术大致相同。我刚刚使用了
.f.0。f、 窗格添加.f.pane.X
+1,用于阅读其他SO答案和跟进