From: Hidetoshi NAGAI Date: 2007-07-02T11:05:27+09:00 Subject: Re: Tk TopLevel window From: Jason Subject: Tk TopLevel window Date: Sat, 30 Jun 2007 23:58:33 +0900 Message-ID: > I have a TkRoot window that when a button is clicked, a new TkToplevel > window is created. > > I don't want the user to be able to get focus of the TkRoot window until > the TkToplevel window is closed. Much like a dialog box. I could > probably catch the FocusOut event on the TkToplevel window and grab > focus again but that seems like a hacked way to do it. Is there an > easier way? Please use TkWindow#set_grab/release_grab methods, and some kinds of tkwait methods. # See also Tcl/Tk's manuals about 'tkwait' and 'vwait'. For example, --------------------------------------------------------------- require 'tk' def create_onetime_toplevel(btn) top = TkToplevel.new(btn).withdraw TkLabel.new(top, :text=>'self.object_id == ' << top.object_id.to_s).pack e = TkEntry.new(top).pack TkButton.new(top, :text=>'CLOSE', :command=>proc{top.destroy}).pack top.deiconify e.focus top.set_grab top.wait_destroy # same as top.tkwait_destroy top.release_grab end def create_reusable_toplevel(btn, var) top = TkToplevel.new(btn).withdraw TkLabel.new(top, :text=>'self.object_id == ' << top.object_id.to_s).pack e = TkEntry.new(top).pack TkButton.new(top, :text=>'CLOSE', :command=>proc{top.withdraw; var.value = 1}).pack [top, e] end root = Tk.root TkEntry.new.pack.focus TkButton.new(:text=>'QUIT', :command=>proc{exit}).pack(:side=>:bottom) b1 = TkButton.new(:text=>'onetime toplevel', :command=>proc{create_onetime_toplevel(b1)}).pack b2 = TkButton.new(:text=>'reusable toplevel').pack wait_var = TkVariable.new reusable_top, entry = create_reusable_toplevel(b2, wait_var) b2.command{ reusable_top.deiconify entry.focus reusable_top.set_grab wait_var.tkwait # wait for writing to wait_var. # It's similar to wait_var.wait, # but tkwait checks the existence of Tk's root window. # When the root window is destroyed, tkwait will finish. reusable_top.release_grab reusable_top.withdraw } Tk.mainloop --------------------------------------------------------------- -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)