我创建了两个树控件小部件和一个滚动条小部件。 现在,我正在尝试创建一个功能,使用户可以选择使用滚动条,因为这将存在单选按钮选项,这些选项将决定哪个小部件随滚动条一起滚动。 我对如何从此处将两个小部件一起滚动有一些想法。 但不确定如何创建可切换的滚动条。 我的代码如下:

package require Tk
package require treectrl

namespace eval ::at::GUI {
  variable Priv;
  variable OptionsRB;

  set Priv(treePrimary) "";
  set Priv(treeSecondary) "";
  set Priv(treeScrollbar) "";

  if { ![info exists OptionsRB] } { 
    set OptionsRB(scrollTree) "LeftTree";
  }
}

proc ::at::GUI::DrawGUI {} {
  variable Priv;

  set frm_treeFrame [ttk::labelframe .treeFrame -text "Tree Area"];      
  set Priv(treePrimary) [treectrl $frm_treeFrame.treePrimary]
  set Priv(treeSecondary) [treectrl $frm_treeFrame.treeSecondary]    
  set Priv(treeScrollbar) [ttk::scrollbar $frm_treeFrame.sb_treeScroll -command "::at::GUI::yview"]

  grid $Priv(treePrimary) $Priv(treeSecondary) $Priv(treeScrollbar) -sticky news;
  grid columnconfigure $frm_treeFrame 0 -weight 1;
  grid columnconfigure $frm_treeFrame 1 -weight 1;
  grid rowconfigure $frm_treeFrame 0 -weight 1;

  set frm_ST [ttk::labelframe .scrollTreeOptions -text "Scroll Option"];  
  set rb_leftTree [ttk::radiobutton $frm_ST.rb1 -text "Left Tree" -variable [namespace current]::OptionsRB(scrollTree) -value LeftTree -command [namespace current]::configScroll ]
  set rb_rightTree [ttk::radiobutton $frm_ST.rb2 -text "Right Tree" -variable [namespace current]::OptionsRB(scrollTree) -value RightTree -command [namespace current]::configScroll ] 
  set rb_bothTree [ttk::radiobutton $frm_ST.rb3 -text "Both Tree" -variable [namespace current]::OptionsRB(scrollTree) -value BothTree -command [namespace current]::configScroll ] 

  grid $rb_leftTree -row 1 -padx {30 5} -pady 5 -sticky w
  grid $rb_rightTree -row 2 -padx {30 5} -pady 5 -sticky w
  grid $rb_bothTree -row 3 -padx {30 5} -pady 5 -sticky w

  # Grid all the frames in main window. 
  grid $frm_treeFrame -sticky news;
  grid $frm_ST -sticky news;

  ##############################
  ::at::GUI::CreateLemes $Priv(treePrimary)
  ::at::GUI::CreateLemes $Priv(treeSecondary)

  foreach tree [list $Priv(treePrimary) $Priv(treeSecondary)] {
    for {set i 0} {$i < 20} {incr i} {
      set parent [expr {int(rand()*$i)}]
      $tree item create -tag item$i -button auto
      $tree item lastchild $parent item$i
      $tree item text item$i name item$i
    }
  }
  return;  
}

proc ::at::GUI::CreateLemes {T} {
  $T element create rect rect -fill [list blue selected]
  $T element create name text

  set S [$T style create nameStyle]
  $T style elements $S {rect name};
  $T style layout $S rect -detach yes -iexpand xy;
  $T style layout $S name -detach no -iexpand xy -expand e;

  $T column create -tag name -itemstyle $S -text Items
  $T configure -treecolumn first;
}

proc ::at::GUI::configScroll {args}  {
  variable Priv;
  variable OptionsRB;

  if {$OptionsRB(scrollTree) eq "LeftTree"} {
    #$Priv(treeSecondary) -yscrollcommand "";
    $Priv(treePrimary) -yscrollcommand "::at::GUI::yset $Priv(treeScrollbar)";
  } elseif {$OptionsRB(scrollTree) eq "RightTree"} {
    #$Priv(treePrimary) -yscrollcommand "";
    $Priv(treeSecondary) -yscrollcommand "::at::GUI::yset $Priv(treeScrollbar)";
  } elseif {$OptionsRB(scrollTree) eq "BothTree"} {
    $Priv(treePrimary) -yscrollcommand "::at::GUI::yset $Priv(treeScrollbar)";
    $Priv(treeSecondary) -yscrollcommand "::at::GUI::yset $Priv(treeScrollbar)";
  }
}

proc ::at::GUI::yset {sb args}  {
  uplevel [linsert $args 0 $sb set]
  ::at::GUI::yview moveto [lindex [$sb get] 0]
}

proc ::at::GUI::yview {args}  {
  variable Priv;
  variable OptionsRB;
  if {$OptionsRB(scrollTree) eq "LeftTree"} {
    eval [linsert $args 0 $Priv(treePrimary) yview];
  } elseif {$OptionsRB(scrollTree) eq "RightTree"} {
    eval [linsert $args 0 $Priv(treeSecondary) yview];
  } elseif {$OptionsRB(scrollTree) eq "BothTree"} {
    eval [linsert $args 0 $Priv(treePrimary) yview];
    eval [linsert $args 0 $Priv(treeSecondary) yview];
  }
}

问题是,每当我尝试单击radiobuttion时,我都会收到一条错误消息:

错误的命令“ -yscrollcommand”:必须处于激活状态,bbox,canvasx,canvasy,cget,折叠,列,比较,配置,内容框,调试,深度,dragimage,元素,扩展,渐变,标题,标识,索引,项目,选取框,通知,数字列,数字,孤儿,范围,扫描,查看,选择,状态,样式,主题,切换,xview或yview错误命令“ -yscrollcommand”:必须处于激活状态,bbox,canvasx,canvasy,cget,折叠,列,比较,配置,内容框,调试,深度,dragimage,元素,展开,渐变,标题,标识,索引,项目,选取框,通知,numcolumns,numitems,孤立对象,范围,扫描,查看,选择,状态,样式,执行“ $ Priv(treeSecondary)-yscrollcommand” :: at :: GUI :: yset $ Priv(treeScrollbar)“”“(过程“ :: at :: GUI :: configScroll”第10行时,主题,切换,xview或yview )从“。:at :: GUI :: configScroll”内部调用。.scrollTreeOptions.rb2内部调用“ .scrollTreeOptions.rb2内部调用”状态{pressed!disabled} {.scrollTreeOptions。 rb2状态! .scrollTreeOptions.rb2 invoke}“(与事件绑定的命令)

但是有趣的部分是,即使出现错误,即使我移动滚动条,它也会在小部件之间切换并按需要工作。 但是错误是我无法理解的。

这是我的第一个传统知识项目,因此我不确定是否缺少一些关键信息。 任何意见??

#1楼 票数:1 已采纳

错误消息是关键。 实际上,包含在Priv(treeSecondary)变量中的命令没有名为-yscrollcommand的子命令。 我认为您想使用configure子命令来更改-yscrollcommand选项的值。 尝试类似:

$Priv(treeSecondary) configure -yscrollcommand "::at::GUI::yset $Priv(treeScrollbar)"

  ask by Puneet Mittal translate from so

未解决问题?本站智能推荐:

1回复

文本小部件/列表框同步多滚动? (Tcl / Tk)

您好,我尝试将一个滚动条绑定到文本小部件和一个列表框-这可能吗? 我希望他们同步滚动; 基本上,列表框将保留文本小部件的行号; 像编辑一样 我正在尝试的代码是这样的: 我在这里看到了此解决方案: 如何为多个列表框(TCL)实现tk滚动条? 问题是它对我不完全有效。 当我单
1回复

TCL画布滚动条不当行为

我试图在画布的帮助下在 TCL 中实现一个可滚动的框架。 我以某种方式设法让它工作,但它的行为有点奇怪:我只能通过按下箭头来滚动,并且滚动条总是完全填满,所以我没有滑块表示我滚动了多远。 此外,我可以在我添加到框架的小部件的边界上上下滚动太多。 我试图添加行$base.fr.can configur
1回复

水平滚动条不起作用

我是tcl / tk的新手,我尝试创建一个包含textarea和两个滚动条(垂直和水平)的界面,我们的问题是我可以看到水平滚动条,但未启用 代码: printScreen:
1回复

tcl / tk:哪些tk小部件可以使用“ tab”创建GUI

我正在用tcl / tk构建GUI。 我想建立一个带有多个标签的窗口。 我可以使用什么tk小部件制作此类GUI。 我没有在手册中找到标签小部件。
1回复

Tcl / Tk:水平xscrollbar不能像y scollbar一样缩小

在以下示例代码中: 按下按钮Push Me ,新的文本字符串将添加到文本框中。 并在.txt insert end "Hello, $name." 没有新行\\n符号。 因此,它应该形成一个很长的字符串。 我的理解是,随着弦线变长,水平滚动条应相应地改变和缩小。 但是xsc
1回复

Tk GUI滚动条

我有一个问题,正在制作的滚动条似乎在左侧,我尝试了许多组合,以便将其向右移动。 我的代码看起来像这样: 请在这件事上给予我帮助.. 谢谢
1回复

将Tk网格小部件集成到笔记本布局中

我想快速制作一个GUI原型,并认为Tk可能很容易学习。 但是,我未能将示例网格视图(框架)集成到笔记本小部件的一个选项卡中。 pack命令将网格放在笔记本的顶部,我无法找出正确的选项。 还是我的方法有问题? 这是代码:
1回复

如何设置Tk小部件的默认字体

我有一个生成许多表单的Tcl / Tk应用程序,并且希望能够从中央位置配置默认小部件字体,而无需使用-font开关配置每个小部件。