2017-08-17 3 views
1

J'essaie d'obtenir la valeur de ttk:entry. J'ai le code suivant.comment obtenir la valeur de ttk: entrée

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 

Mais j'obtiens l'erreur sur les dernières met

+0

La variable n'existe pas jusqu'à ce que quelque chose est écrit dans l'entrée. Vous devrez lier l'action de sortie à un événement tel que Return (qui se déclenche lorsque vous appuyez sur la touche Entrée et relâchez-la). Comme ceci: 'bind $ wi.custcfg.daddr {puts $ :: DefaultRoot}' (un nom de procédure est même meilleur qu'un script ici). –

+0

J'ai essayé quelque chose comme ça 'ttk :: entry $ wi.custcfg.daddr -largeur 10 -textvariable :: DefaultRoot -validate focusout -validatecommand {puts $ :: DefaultRoot; return 1} met $ DefaultRoot ' mais je reçois toujours une erreur sur les derniers puts –

+0

Fonctionne bien pour moi. Lorsque les derniers puts sont exécutés, un message d'erreur s'affiche car l'entrée n'a pas encore été utilisée, mais dès que le texte a été saisi et que l'entrée n'a plus de focus, les puts du script de validation fonctionnent correctement. Vous ne pouvez pas vous attendre à ce que les puts de la dernière ligne fonctionnent, sauf si vous créez vous-même la variable (c'est-à-dire que vous lui donnez une valeur). –

Répondre

1

Vous pouvez accéder à la variable partout via

global DefaultRoot 
puts $DefaultRoot 

ou

puts $::DefaultRoot 
+0

J'ai mis à jour le code mais cela n'a pas fonctionné pour moi. –

2

La variable n'existera jusqu'à ce que vous le mettre à une certaine valeur. Le déclarer simplement comme une variable (par exemple: variable DefaultRoot) ne le fera pas apparaître.

Avec le code que vous avez publié, vous exécutez le dernier puts environ une microseconde après la création du widget d'entrée. L'utilisateur n'aura pas la possibilité d'entrer du texte avant le puts. Ainsi, la variable n'existera pas encore et le puts échouera.

Une solution simple consiste à s'assurer de définir la variable avant d'appeler puts, mais cela signifie seulement que puts affichera la valeur par défaut.

En d'autres termes, cela affichera « valeur par défaut »:

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

Pour répondre à votre question, cependant, vous pouvez utiliser $::DefaultRoot partout où vous voulez après la variable a été créée.

Par exemple, vous pouvez créer un bouton qui imprime la valeur comme ceci:

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