2017-08-17 199 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