2010-09-03 99 views
4

我有一组radiobuttons(比如说,有选择1和2),并且需要根据用户的选择显示一些小部件。例如,如果他们选择1,我会向他们展示一个labelframe与几个radiobuttons;而如果他们选择2,我会向他们展示一个labelframe与一些buttons。无论哪种情况,结果内容都将显示在窗口的相同区域中。什么是动态显示不同内容的好方法(在Tcl/Tk中)?

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

This answer让我想我应该使用panedwindowframes,但我不太清楚我将如何切换不同的内容。

+1

+1用于阅读其他SO答案和跟进 – 2010-09-06 08:47:30

回答

3

当使用panedwindow时,您应该能够在内容窗格之间切换,方法是删除一个框架并添加一个新框架来替换它。有关ttk :: panedwindow的forgetadd/insert命令的说明,请参见this manual page

示例代码:

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 

您可以修改这个代码,根据自己的需要。只需创建您可能需要的所有视图,然后根据需要将其交换出来。

+0

将窗格选择钩住单选按钮的最简单方法是在单选按钮的共享状态变量上使用写入“trace”。 – 2010-09-04 07:00:55

+0

@Donal我试图去追踪'路线,但我的代码阻止了单选按钮改变,并给了我一个错误。下面是代码('demoChoice'是单选变量): '设置inEvent 0 跟踪变量demoChoice W { 全球demoChoice inEvent 如果($ inEvent){}回报一套 1 inEvent .main.demoDetails.lbl配置-text $ demoChoice set inEvent 0 }' – Pat 2010-09-07 14:09:31

+0

@Pat:使用跟踪回调的过程。 – 2010-09-07 15:13:37

1

一个非常简单的方法是对每组数据使用一个帧。使用grid将它们全部放在同一行和列中。然后,所有您需要做的就是提高框架,并且它是子级叠加顺序的顶部。

另一种技术开始相同,但不是使用raise,而是在当前正在显示的帧上执行grid remove,然后在要显示的帧上执行grid。使用grid remove时,grid会记住所有设置,以便下次希望显示时不必再指定所有选项。

相关问题