2017-08-17 197 views
1

我试图从ttk:entry获取值。我有以下代码。如何从ttk获取值:条目

variable DefaultRoot 

ttk::label $wi.custcfg.dlabel -text "Default Root:" 
ttk::entry $wi.custcfg.daddr -width 10 -textvariable ::DefaultRoot -validate focusout -validatecommand { puts $::DefaultRoot; return 1} 

puts $DefaultRoot 

但我得到的最后提出

+0

变量不存在,直到东西写入条目。您需要将输出操作绑定到返回事件(当您按下并释放返回键时触发)。像这样:'bind $ wi.custcfg.daddr {puts $ :: DefaultRoot}'(过程名称比这里的脚本更好)。 –

+0

我试过这样的事情 'ttk :: entry $ wi.custcfg.daddr -width 10 -textvariable :: DefaultRoot -validate focusout -validatecommand {puts $ :: DefaultRoot;返回1} 把$ DefaultRoot' ,但我仍然得到最后一个投入的错误 –

+0

工作适合我。当最后一个put被执行时,它会给出一个错误消息,因为该条目还没有被使用,但是一旦输入了文本并且条目失去焦点,放入验证脚本的工作就可以正常工作。除非你自己创建变量(即给它一个值),否则你永远不会期望放在最后一行。 –

回答

1

您可以通过

global DefaultRoot 
puts $DefaultRoot 

puts $::DefaultRoot 
+0

我更新了代码,但它不适合我。 –

2

任何地方访问变量错误变量将不存在,直到你将其设置为某个值。仅仅声明它是一个变量(例如:variable DefaultRoot)将不会使它变成现实。

使用您发布的代码,您在创建条目窗口小部件后大约1微秒执行最后的puts。在发生puts之前,用户将无法输入任何文本。因此,该变量将不存在,并且puts将失败。

一个简单的解决方案是确保在调用puts之前设置该变量,但这只意味着puts将打印默认值。

换句话说,这将打印“这是默认值”:

variable DefaultRoot 
set DefaultRoot "this is the default" 
ttk::entry $wi.custcfg.daddr -textvariable ::DefaultRoot 
puts $DefaultRoot 

为了回答您的具体问题,但是,你可以使用$::DefaultRoot任何你想要变量已创建之后。

例如,您可以创建一个按钮,打印这样的值:

proc print_variable {} { 
    puts "DefaultRoot=$::DefaultRoot" 
} 
ttk::button $wi.custcfg.button -text foo -command print_variable