From: Hidetoshi NAGAI Date: 2011-09-07T03:21:04+09:00 Subject: Re: TkEntry - how do I read/capture what was typed? Hi, From: Joe Collins Subject: Re: TkEntry - how do I read/capture what was typed? Date: Tue, 6 Sep 2011 21:38:21 +0900 Message-ID: > can TKEntry invoke a defined procedure to grab that input when the user > is done typing? How about this? ------------------------------- require 'tk' class PasswdEntry < TkFrame def initialize(*args) super(*args) @frame = self width = 15 # create widgets @label1 = TkLabel.new(@frame, :text=>'Password ') @var1 = TkVariable.new @entry1 = TkEntry.new(@frame, :textvariable=>@var1, :width=>width, :show=>'*', :foreground=>'red') @passwd_ok = false @label2 = TkLabel.new(@frame, :text=>'Re-Type ') @var2 = TkVariable.new @entry2 = TkEntry.new(@frame, :textvariable=>@var2, :width=>width, :show=>'*', :foreground=>'red') @retype_ok = false # grid widgets TkGrid.column(@frame, 0, :weight=>0) TkGrid.column(@frame, 1, :weight=>1) @label1.grid(:row=>0, :column=>0, :sticky=>'w') @entry1.grid(:row=>0, :column=>1, :sticky=>'news') @label2.grid(:row=>1, :column=>0, :sticky=>'w') @entry2.grid(:row=>1, :column=>1, :sticky=>'news') # trace variables @var1.trace(:write){|var, idx, op| check_passwd(var.value)} @var2.trace(:write){|var, idx, op| check_retype(var.value)} # define bindings @entry1.bind('Return'){@entry2.focus if @passwd_ok} @entry2.bind('Return'){ if @cmd && @passwd_ok && @retype_ok @cmd.call(@var1.value) @entry1.focus end } end def callback(&block) @cmd = block end def focus @entry1.focus end def get_passwd if @passwd_ok && @retype_ok @var1.value else false end end ###################### private ###################### def check_passwd(str) # check pattern of password string #if str.length >= 6 && str =~ /\d/ && str =~ /[A-Z]/ && str =~ /[a-z]/ if str.length >= 6 @entry1.foreground 'black' @passwd_ok = true else @entry1.foreground 'red' @passwd_ok = false end end def check_retype(str) if @passwd_ok && str == @var1.value @entry2.foreground 'black' @retype_ok = true else @entry2.foreground 'red' @retype_ok = false end end end passwd = PasswdEntry.new.pack btn = TkButton.new(:text=>'print passwd', :command=>proc{p passwd.get_passwd}).pack passwd.callback{|str| btn.invoke} passwd.focus Tk.mainloop ------------------------------- -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp) Department of Artificial Intelligence, Kyushu Institute of Technology