2017-10-18 135 views
0
global SelectMode 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {puts [.lb curselection]} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

当我第一次选择项目列表框中(选择“FUNC2”为例),然后在下拉列表中选择模式,然后我得到一个意外的空字符串输出象下面这样:如何保持列表框项选择状态?

1 
"" (unneeded) 

如何保持列表框项目选择状态并且不受组合框的影响?谢谢

+0

FWIW,我不能再现这个问题。据推测,此代码中的其他内容不会导致多余的空字符串。 –

+0

@Peter Lewerin ehm ...我在Linux上再次尝试,额外的空字符串不会出现。这很好,你有什么想法继续显示列表框项目选择状态,不需要输出字符串? – Jimmy

+0

那么,从技术上讲,选择状态*已经显示在列表框小部件中,但是如何使用与现在相同的绑定,但是如何设置标签小部件的文本而不是输出选择? –

回答

0

.lb curselection命令利用窗口管理器焦点知道选择什么。由于窗口管理器正忙于另一个元素(在这种情况下是组合框),因此无法看到列表框中有选择。解决方案是编写一个过程来跟踪列表框的选择。并在选择更改时更新变量。

global SelectMode 
lb_selection = "" 
set SelectMode mode1 
set FunList {Func1 Func2 Func3} 
listbox .lb -listvariable FunList 
bind .lb <<ListboxSelect>> {ListSelectionChanged %W} 
ttk::combobox .com -values {mode1 mode2 mode3} -textvariable SelectMode 
pack .lb 
pack .com 

# Procedure bound to <<ListboxSelect>> virtual event. 
proc ListSelectionChanged { listbox } { 
    global lb_selection 
    set lb_selection [$listbox curselection] 
} 

# Procedure to repeatedly print the selection status of the listbox 
proc printLBSelection { } { 
    global lb_selection 
    puts $lb_selection 
    after 2000 printLBSelection 
} 
+0

感谢您的解释,但我不想重复打印选择状态,我只是想继续显示列表框有一个选择。按照你的建议,我在printLBSelection中添加了“$ listbox selection set $ lb_selection”,它似乎是可行的,但是如果没有使用“2000 printLBSelection”之后还有其他解决方法吗?谢谢。 – Jimmy

+0

@Peter Lewerin上面的评论可能是你正在寻找的整体。它会有点像组合框,因为标签可以存储当前的列表框选择。使用StringVar作为标签的文本变量,而不是全局变量,每当列表框值发生变化时,都调用标签变量的.set()方法来更新选择。那么你不需要打印任何东西 - 答案会在用户界面上更明显。 –

0

您可以将exportselection选项设置为false,以防止在其他小部件有选择时更改选择。

listbox .lb -listvariable FunList -exportselection false 
+0

谢谢!这真是我想要的! – Jimmy

相关问题