From: "Ara.T.Howard" Date: 2004-04-26T03:14:07+09:00 Subject: Re: tk: how to dynamically remove / add widgets? ---1400057925-942873692-1082910975=:3136 Content-Type: MULTIPART/MIXED; BOUNDARY="-1400057925-942873692-1082910975=:3136" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1400057925-942873692-1082910975=:3136 Content-Type: TEXT/PLAIN; charset=US-ASCII On Sun, 25 Apr 2004, Its Me wrote: > Thanks ... > > "Hidetoshi NAGAI" wrote in message > > Use 'bind' method. > > The follwing is a sample of binding. > > self.bind('Enter', proc{self.background(self.activebackground)}) > > This seems to be about binding and re-binding the callbacks on a widget. > > What I want to do is actually remove widgets and add new widget to some > containing frame. > > Any way to do that? it's tricky to do without making the parent re-size: require 'tk' require 'tkencoding' unless %r/^8\.[1-9]/o =~ Tk::TCL_VERSION && !Tk::JAPANIZED_TK class Widget attr :widget def initialize master @master = master end end class FooWindow < Widget def initialize master super @widget = TkLabel.new @master, 'text'=>'foo' end end class BarWindow < Widget def initialize master super @widget = TkLabel.new @master, 'text'=>'bar' end end class Gui < Widget def initialize master = TkRoot.new super init_geometry build_widget build_button_bar build_window_frame build_windows grid_configure end def init_geometry case @master when TkRoot, TkWindow, Tk::Wm @width = @master.winfo_screenwidth * 0.42 @height = @master.winfo_screenheight * 0.42 @master.configure 'width'=>@width, 'height'=>@height @master.geometry '+50+50' else @width = @master.width @height = @master.height end end def build_widget @widget = TkFrame.new @master @widget.place 'relx'=>0, 'rely'=>0, 'relwidth'=>1, 'relheight'=>1 end def build_button_bar @button_frame = TkFrame.new @widget @button_frame.grid 'sticky'=>'ew' @foo_button = TkButton.new @button_frame, 'text'=>'foo' @foo_button.configure 'command'=>lambda{set_window @foo_window} @foo_button.pack @bar_button = TkButton.new @button_frame, 'text'=>'bar' @bar_button.configure 'command'=>lambda{set_window @bar_window} @bar_button.pack end def build_window_frame @window_frame = TkFrame.new @widget @window_frame.grid 'sticky'=>'nsew' end def build_windows @foo_window = FooWindow.new @window_frame @bar_window = BarWindow.new @window_frame end def grid_configure TkGrid.rowconfigure @widget, 1, 'weight'=>1 TkGrid.columnconfigure @widget, 0, 'weight'=>1 end def set_window widget @window.place_forget if @window @window = widget.widget @window.place 'relx'=>0, 'rely'=>0, 'relwidth'=>1, 'relheight'=>1, 'in'=>@window_frame end end Gui.new Tk.mainloop the key bit is the set_window method... -a -- =============================================================================== | EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov | PHONE :: 303.497.6469 | ADDRESS :: E/GC2 325 Broadway, Boulder, CO 80305-3328 | URL :: http://www.ngdc.noaa.gov/stp/ | TRY :: for l in ruby perl;do $l -e "print \"\x3a\x2d\x29\x0a\"";done =============================================================================== ---1400057925-942873692-1082910975=:3136 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="setwidget.rb" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="setwidget.rb" cmVxdWlyZSAndGsnDQpyZXF1aXJlICd0a2VuY29kaW5nJyB1bmxlc3MgJXIv XjhcLlsxLTldL28gPX4gVGs6OlRDTF9WRVJTSU9OICYmICFUazo6SkFQQU5J WkVEX1RLDQoNCmNsYXNzIFdpZGdldA0KICBhdHRyIDp3aWRnZXQNCiAgZGVm IGluaXRpYWxpemUgbWFzdGVyDQogICAgQG1hc3RlciA9IG1hc3Rlcg0KICBl bmQNCmVuZA0KY2xhc3MgRm9vV2luZG93IDwgV2lkZ2V0DQogIGRlZiBpbml0 aWFsaXplIG1hc3Rlcg0KICAgIHN1cGVyDQogICAgQHdpZGdldCA9IFRrTGFi ZWwubmV3IEBtYXN0ZXIsICd0ZXh0Jz0+J2ZvbycNCiAgZW5kDQplbmQNCmNs YXNzIEJhcldpbmRvdyA8IFdpZGdldA0KICBkZWYgaW5pdGlhbGl6ZSBtYXN0 ZXINCiAgICBzdXBlcg0KICAgIEB3aWRnZXQgPSBUa0xhYmVsLm5ldyBAbWFz dGVyLCAndGV4dCc9PidiYXInDQogIGVuZA0KZW5kDQpjbGFzcyBHdWkgPCBX aWRnZXQNCiAgZGVmIGluaXRpYWxpemUgbWFzdGVyID0gVGtSb290Lm5ldw0K ICAgIHN1cGVyDQogICAgaW5pdF9nZW9tZXRyeQ0KICAgIGJ1aWxkX3dpZGdl dA0KICAgIGJ1aWxkX2J1dHRvbl9iYXINCiAgICBidWlsZF93aW5kb3dfZnJh bWUNCiAgICBidWlsZF93aW5kb3dzDQogICAgZ3JpZF9jb25maWd1cmUNCiAg ZW5kDQogIGRlZiBpbml0X2dlb21ldHJ5DQogICAgY2FzZSBAbWFzdGVyDQog ICAgICB3aGVuIFRrUm9vdCwgVGtXaW5kb3csIFRrOjpXbQ0KICAgICAgICBA d2lkdGggPSBAbWFzdGVyLndpbmZvX3NjcmVlbndpZHRoICogMC40MiANCiAg ICAgICAgQGhlaWdodCA9IEBtYXN0ZXIud2luZm9fc2NyZWVuaGVpZ2h0ICog MC40Mg0KICAgICAgICBAbWFzdGVyLmNvbmZpZ3VyZSAnd2lkdGgnPT5Ad2lk dGgsICdoZWlnaHQnPT5AaGVpZ2h0DQogICAgICAgIEBtYXN0ZXIuZ2VvbWV0 cnkgJys1MCs1MCcNCiAgICAgIGVsc2UNCiAgICAgICAgQHdpZHRoID0gQG1h c3Rlci53aWR0aA0KICAgICAgICBAaGVpZ2h0ID0gQG1hc3Rlci5oZWlnaHQN CiAgICBlbmQNCiAgZW5kDQogIGRlZiBidWlsZF93aWRnZXQNCiAgICBAd2lk Z2V0ID0gVGtGcmFtZS5uZXcgQG1hc3Rlcg0KICAgIEB3aWRnZXQucGxhY2Ug J3JlbHgnPT4wLCAncmVseSc9PjAsICdyZWx3aWR0aCc9PjEsICdyZWxoZWln aHQnPT4xIA0KICBlbmQNCiAgZGVmIGJ1aWxkX2J1dHRvbl9iYXINCiAgICBA YnV0dG9uX2ZyYW1lID0gVGtGcmFtZS5uZXcgQHdpZGdldA0KICAgIEBidXR0 b25fZnJhbWUuZ3JpZCAgJ3N0aWNreSc9PidldycNCiAgICBAZm9vX2J1dHRv biA9IFRrQnV0dG9uLm5ldyBAYnV0dG9uX2ZyYW1lLCAndGV4dCc9Pidmb28n DQogICAgQGZvb19idXR0b24uY29uZmlndXJlICdjb21tYW5kJz0+bGFtYmRh e3NldF93aW5kb3cgQGZvb193aW5kb3d9DQogICAgQGZvb19idXR0b24ucGFj aw0KICAgIEBiYXJfYnV0dG9uID0gVGtCdXR0b24ubmV3IEBidXR0b25fZnJh bWUsICd0ZXh0Jz0+J2JhcicNCiAgICBAYmFyX2J1dHRvbi5jb25maWd1cmUg J2NvbW1hbmQnPT5sYW1iZGF7c2V0X3dpbmRvdyBAYmFyX3dpbmRvd30NCiAg ICBAYmFyX2J1dHRvbi5wYWNrDQogIGVuZA0KICBkZWYgYnVpbGRfd2luZG93 X2ZyYW1lDQogICAgQHdpbmRvd19mcmFtZSA9IFRrRnJhbWUubmV3IEB3aWRn ZXQNCiAgICBAd2luZG93X2ZyYW1lLmdyaWQgICdzdGlja3knPT4nbnNldycN CiAgZW5kDQogIGRlZiBidWlsZF93aW5kb3dzDQogICAgQGZvb193aW5kb3cg PSBGb29XaW5kb3cubmV3IEB3aW5kb3dfZnJhbWUgDQogICAgQGJhcl93aW5k b3cgPSBCYXJXaW5kb3cubmV3IEB3aW5kb3dfZnJhbWUgDQogIGVuZA0KICBk ZWYgZ3JpZF9jb25maWd1cmUNCiAgICBUa0dyaWQucm93Y29uZmlndXJlIEB3 aWRnZXQsIDEsICd3ZWlnaHQnPT4xDQogICAgVGtHcmlkLmNvbHVtbmNvbmZp Z3VyZSBAd2lkZ2V0LCAwLCAnd2VpZ2h0Jz0+MQ0KICBlbmQNCiAgZGVmIHNl dF93aW5kb3cgd2lkZ2V0IA0KICAgIEB3aW5kb3cucGxhY2VfZm9yZ2V0IGlm IEB3aW5kb3cNCiAgICBAd2luZG93ID0gd2lkZ2V0LndpZGdldA0KICAgIEB3 aW5kb3cucGxhY2UgJ3JlbHgnPT4wLCAncmVseSc9PjAsIA0KICAgICAgICAg ICAgICAgICAgJ3JlbHdpZHRoJz0+MSwgJ3JlbGhlaWdodCc9PjEsDQogICAg ICAgICAgICAgICAgICAnaW4nPT5Ad2luZG93X2ZyYW1lDQogIGVuZA0KZW5k DQoNCg0KR3VpLm5ldw0KVGsubWFpbmxvb3ANCg== ---1400057925-942873692-1082910975=:3136-- ---1400057925-942873692-1082910975=:3136--