# class TkWindow

### Constants

TkCommandNames
WidgetClassName

  ## > If TkCommandNames is a string (not a null string),¶ ↑

      assume the string is a Tcl/Tk's create command of the widget class.

### Public Class Methods

_widget_inspect_full_=(mode) click to toggle source

    # File lib/tk.rb, line 5048
    def TkWindow._widget_inspect_full_=(mode)
      @@WIDGET_INSPECT_FULL = (mode && true) || false
    end

_widget_inspect_full_?() click to toggle source

    # File lib/tk.rb, line 5045
    def TkWindow._widget_inspect_full_?
      @@WIDGET_INSPECT_FULL
    end

database_class() click to toggle source

    # File lib/tk.rb, line 5219
    def self.database_class
      WidgetClassNames[self::WidgetClassName]
    end

database_classname() click to toggle source

    # File lib/tk.rb, line 5216
    def self.database_classname
      self::WidgetClassName
    end

new(parent=nil, keys=nil) click to toggle source

    # File lib/tk.rb, line 5062
    def initialize(parent=nil, keys=nil)
      if parent.kind_of? Hash
        keys = _symbolkey2str(parent)
        parent = keys.delete('parent')
        widgetname = keys.delete('widgetname')
        install_win(if parent then parent.path end, widgetname)
        without_creating = keys.delete('without_creating')
        # if without_creating && !widgetname
        #   fail ArgumentError,
        #        "if set 'without_creating' to true, need to define 'widgetname'"
        # end
      elsif keys
        keys = _symbolkey2str(keys)
        widgetname = keys.delete('widgetname')
        install_win(if parent then parent.path end, widgetname)
        without_creating = keys.delete('without_creating')
        # if without_creating && !widgetname
        #   fail ArgumentError,
        #        "if set 'without_creating' to true, need to define 'widgetname'"
        # end
      else
        install_win(if parent then parent.path end)
      end
      if self.method(:create_self).arity == 0
        p 'create_self has no arg' if $DEBUG
        create_self unless without_creating
        if keys
          # tk_call @path, 'configure', *hash_kv(keys)
          configure(keys)
        end
      else
        p 'create_self has args' if $DEBUG
        fontkeys = {}
        methodkeys = {}
        if keys
          #['font', 'kanjifont', 'latinfont', 'asciifont'].each{|key|
          #  fontkeys[key] = keys.delete(key) if keys.key?(key)
          #}
          __font_optkeys.each{|key|
            fkey = key.to_s
            fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey)

            fkey = "kanji#{key}"
            fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey)

            fkey = "latin#{key}"
            fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey)

            fkey = "ascii#{key}"
            fontkeys[fkey] = keys.delete(fkey) if keys.key?(fkey)
          }

          __optkey_aliases.each{|alias_name, real_name|
            alias_name = alias_name.to_s
            if keys.has_key?(alias_name)
              keys[real_name.to_s] = keys.delete(alias_name)
            end
          }

          __methodcall_optkeys.each{|key|
            key = key.to_s
            methodkeys[key] = keys.delete(key) if keys.key?(key)
          }

          __ruby2val_optkeys.each{|key, method|
            key = key.to_s
            keys[key] = method.call(keys[key]) if keys.has_key?(key)
          }
        end
        if without_creating && keys
          #configure(keys)
          configure(__conv_keyonly_opts(keys))
        else
          #create_self(keys)
          create_self(__conv_keyonly_opts(keys))
        end
        font_configure(fontkeys) unless fontkeys.empty?
        configure(methodkeys) unless methodkeys.empty?
      end
    end

to_eval() click to toggle source

WidgetClassNames = self

    ==> If self is a widget class, entry to the WidgetClassNames table.

    # File lib/tk.rb, line 5058
    def self.to_eval
      self::WidgetClassName
    end

### Public Instance Methods

bind_class() click to toggle source

    # File lib/tk.rb, line 5201
    def bind_class
      @db_class || self.class()
    end

bindtags(taglist=nil) click to toggle source

    # File lib/tk.rb, line 5689
    def bindtags(taglist=nil)
      if taglist
        fail ArgumentError, "taglist must be Array" unless taglist.kind_of? Array
        tk_call('bindtags', path, taglist)
        taglist
      else
        list(tk_call('bindtags', path)).collect{|tag|
          if tag.kind_of?(String)
            if cls = WidgetClassNames[tag]
              cls
            elsif btag = TkBindTag.id2obj(tag)
              btag
            else
              tag
            end
          else
            tag
          end
        }
      end
    end

bindtags=(taglist) click to toggle source

    # File lib/tk.rb, line 5711
    def bindtags=(taglist)
      bindtags(taglist)
      taglist
    end

bindtags_shift() click to toggle source

    # File lib/tk.rb, line 5716
    def bindtags_shift
      taglist = bindtags
      tag = taglist.shift
      bindtags(taglist)
      tag
    end

bindtags_unshift(tag) click to toggle source

    # File lib/tk.rb, line 5723
    def bindtags_unshift(tag)
      bindtags(bindtags().unshift(tag))
    end

caret(keys=nil) click to toggle source

    # File lib/tk.rb, line 5604
    def caret(keys=nil)
      TkXIM.caret(path, keys)
    end

colormodel(model=None) click to toggle source

    # File lib/tk.rb, line 5599
    def colormodel(model=None)
      tk_call('tk', 'colormodel', path, model)
      self
    end

command(cmd=nil, &b) click to toggle source

    # File lib/tk.rb, line 5589
    def command(cmd=nil, &b)
      if cmd
        configure_cmd('command', cmd)
      elsif b
        configure_cmd('command', Proc.new(&b))
      else
        cget('command')
      end
    end

current_grab()
Alias for: grab_current
cursor_propagate(cursor) click to toggle source

    # File lib/tkextlib/tcllib/cursor.rb, line 57
    def cursor_propagate(cursor)
      # Sets the cursor for self and all its descendants to cursor.
      #tk_call_without_enc('::cursor::propagate', @path, cursor)
      Tk::Tcllib::Cursor.cursor_propagate(self, cursor)
    end

cursor_restore(cursor = None) click to toggle source

    # File lib/tkextlib/tcllib/cursor.rb, line 62
    def cursor_restore(cursor = None)
      # Restore the original or previously set cursor for self and all its
      # descendants. If cursor is specified, that will be used if on any
      # widget that did not have a preset cursor (set by a previous call
      # to TkWindow#cursor_propagate).
      #tk_call_without_enc('::cursor::restore', @path, cursor)
      Tk::Tcllib::Cursor.cursor_restore(self, cursor)
    end

database_class() click to toggle source

    # File lib/tk.rb, line 5208
    def database_class
      name = database_classname()
      if WidgetClassNames[name]
        WidgetClassNames[name]
      else
        TkDatabaseClass.new(name)
      end
    end

database_classname() click to toggle source

    # File lib/tk.rb, line 5205
    def database_classname
      TkWinfo.classname(self)
    end

destroy() click to toggle source
Calls superclass method TkObject#destroy

    # File lib/tk.rb, line 5608
    def destroy
      super
      children = []
      rexp = /^#{self.path}\.[^.]+$/
      TkCore::INTERP.tk_windows.each{|path, obj|
        children << [path, obj] if path =~ rexp
      }
      if defined?(@cmdtbl)
        for id in @cmdtbl
          uninstall_cmd id
        end
      end

      children.each{|path, obj|
        obj.instance_eval{
          if defined?(@cmdtbl)
            for id in @cmdtbl
              uninstall_cmd id
            end
          end
        }
        TkCore::INTERP.tk_windows.delete(path)
      }

      begin
        tk_call_without_enc('destroy', epath)
      rescue
      end
      uninstall_win
    end

eventloop_tkwait()
Alias for: eventloop_wait_visibility
eventloop_tkwait_destroy()
Alias for: eventloop_wait_destroy
eventloop_tkwait_visibility()
Alias for: eventloop_wait_visibility
eventloop_tkwait_window()
Alias for: eventloop_wait_destroy
eventloop_wait()
Alias for: eventloop_wait_visibility
eventloop_wait_destroy() click to toggle source

    # File lib/tk.rb, line 5671
    def eventloop_wait_destroy
      wait_destroy(false)
    end

Also aliased as: eventloop_wait_window, eventloop_tkwait_destroy, eventloop_tkwait_window
eventloop_wait_visibility() click to toggle source

    # File lib/tk.rb, line 5647
    def eventloop_wait_visibility
      wait_visibility(false)
    end

Also aliased as: eventloop_wait, eventloop_tkwait, eventloop_tkwait_visibility
eventloop_wait_window()
Alias for: eventloop_wait_destroy
exist?() click to toggle source

    # File lib/tk.rb, line 5195
    def exist?
      TkWinfo.exist?(self)
    end

focus(force=false)
Alias for: set_focus
grab(opt = nil) click to toggle source

    # File lib/tk.rb, line 5527
    def grab(opt = nil)
      unless opt
        tk_call_without_enc('grab', 'set', path)
        return self
      end

      case opt
      when 'set', :set
        tk_call_without_enc('grab', 'set', path)
        return self
      when 'global', :global
        #return(tk_call('grab', 'set', '-global', path))
        tk_call_without_enc('grab', 'set', '-global', path)
        return self
      when 'release', :release
        #return tk_call('grab', 'release', path)
        tk_call_without_enc('grab', 'release', path)
        return self
      when 'current', :current
        return window(tk_call_without_enc('grab', 'current', path))
      when 'status', :status
        return tk_call_without_enc('grab', 'status', path)
      else
        return tk_call_without_enc('grab', opt, path)
      end
    end

grab_current() click to toggle source

    # File lib/tk.rb, line 5554
    def grab_current
      grab('current')
    end

Also aliased as: current_grab
grab_release() click to toggle source

    # File lib/tk.rb, line 5558
    def grab_release
      grab('release')
    end

Also aliased as: release_grab
grab_set() click to toggle source

    # File lib/tk.rb, line 5562
    def grab_set
      grab('set')
    end

Also aliased as: set_grab
grab_set_global() click to toggle source

    # File lib/tk.rb, line 5566
    def grab_set_global
      grab('global')
    end

Also aliased as: set_global_grab
grab_status() click to toggle source

    # File lib/tk.rb, line 5570
    def grab_status
      grab('status')
    end

grid(keys = nil) click to toggle source

    # File lib/tk.rb, line 5296
    def grid(keys = nil)
      #tk_call 'grid', epath, *hash_kv(keys)
      if keys
        TkGrid.configure(self, keys)
      else
        TkGrid.configure(self)
      end
      self
    end

grid_anchor(anchor=None) click to toggle source

    # File lib/tk.rb, line 5318
    def grid_anchor(anchor=None)
      if anchor == None
        TkGrid.anchor(self)
      else
        TkGrid.anchor(self, anchor)
        self
      end
    end

grid_bbox(*args) click to toggle source

    # File lib/tk.rb, line 5334
    def grid_bbox(*args)
      #list(tk_call('grid', 'bbox', epath, *args))
      TkGrid.bbox(self, *args)
    end

grid_column(index, keys=nil) click to toggle source

    # File lib/tk.rb, line 5393
    def grid_column(index, keys=nil)
      if keys.kind_of?(Hash)
        grid_columnconfigure(index, keys)
      else
        grid_columnconfiginfo(index, keys)
      end
    end

grid_columnconfig(index, keys) click to toggle source

    # File lib/tk.rb, line 5353
    def grid_columnconfig(index, keys)
      #tk_call('grid', 'columnconfigure', epath, index, *hash_kv(keys))
      TkGrid.columnconfigure(self, index, keys)
    end

Also aliased as: grid_columnconfigure
grid_columnconfiginfo(index, slot=nil) click to toggle source

    # File lib/tk.rb, line 5365
    def grid_columnconfiginfo(index, slot=nil)
      #if slot
      #  tk_call('grid', 'columnconfigure', epath, index, "-#{slot}").to_i
      #else
      #  ilist = list(tk_call('grid', 'columnconfigure', epath, index))
      #  info = {}
      #  while key = ilist.shift
      #   info[key[1..-1]] = ilist.shift
      #  end
      #  info
      #end
      TkGrid.columnconfiginfo(self, index, slot)
    end

grid_columnconfigure(index, keys)
Alias for: grid_columnconfig
grid_config(slot, value=None) click to toggle source

    # File lib/tk.rb, line 5339
    def grid_config(slot, value=None)
      #if slot.kind_of? Hash
      #  tk_call 'grid', 'configure', epath, *hash_kv(slot)
      #else
      #  tk_call 'grid', 'configure', epath, "-#{slot}", value
      #end
      if slot.kind_of? Hash
        TkGrid.configure(self, slot)
      else
        TkGrid.configure(self, slot=>value)
      end
    end

Also aliased as: grid_configure
grid_configure(slot, value=None)
Alias for: grid_config
grid_forget() click to toggle source

    # File lib/tk.rb, line 5327
    def grid_forget
      #tk_call('grid', 'forget', epath)
      TkGrid.forget(self)
      self
    end

Also aliased as: ungrid
grid_in(target, keys = nil) click to toggle source

    # File lib/tk.rb, line 5306
    def grid_in(target, keys = nil)
      if keys
        keys = keys.dup
        keys['in'] = target
      else
        keys = {'in'=>target}
      end
      #tk_call 'grid', epath, *hash_kv(keys)
      TkGrid.configure(self, keys)
      self
    end

grid_info() click to toggle source

    # File lib/tk.rb, line 5409
    def grid_info()
      #list(tk_call('grid', 'info', epath))
      TkGrid.info(self)
    end

grid_location(x, y) click to toggle source

    # File lib/tk.rb, line 5414
    def grid_location(x, y)
      #list(tk_call('grid', 'location', epath, x, y))
      TkGrid.location(self, x, y)
    end

grid_propagate(mode=None) click to toggle source

    # File lib/tk.rb, line 5419
    def grid_propagate(mode=None)
      #if mode == None
      #  bool(tk_call('grid', 'propagate', epath))
      #else
      #  tk_call('grid', 'propagate', epath, mode)
      #  self
      #end
      if mode == None
        TkGrid.propagate(self)
      else
        TkGrid.propagate(self, mode)
        self
      end
    end

grid_remove() click to toggle source

    # File lib/tk.rb, line 5434
    def grid_remove()
      #tk_call 'grid', 'remove', epath
      TkGrid.remove(self)
      self
    end

grid_row(index, keys=nil) click to toggle source

    # File lib/tk.rb, line 5401
    def grid_row(index, keys=nil)
      if keys.kind_of?(Hash)
        grid_rowconfigure(index, keys)
      else
        grid_rowconfiginfo(index, keys)
      end
    end

grid_rowconfig(index, keys) click to toggle source

    # File lib/tk.rb, line 5359
    def grid_rowconfig(index, keys)
      #tk_call('grid', 'rowconfigure', epath, index, *hash_kv(keys))
      TkGrid.rowconfigure(self, index, keys)
    end

Also aliased as: grid_rowconfigure
grid_rowconfiginfo(index, slot=nil) click to toggle source

    # File lib/tk.rb, line 5379
    def grid_rowconfiginfo(index, slot=nil)
      #if slot
      #  tk_call('grid', 'rowconfigure', epath, index, "-#{slot}").to_i
      #else
      #  ilist = list(tk_call('grid', 'rowconfigure', epath, index))
      #  info = {}
      #  while key = ilist.shift
      #   info[key[1..-1]] = ilist.shift
      #  end
      #  info
      #end
      TkGrid.rowconfiginfo(self, index, slot)
    end

grid_rowconfigure(index, keys)
Alias for: grid_rowconfig
grid_size() click to toggle source

    # File lib/tk.rb, line 5440
    def grid_size()
      #list(tk_call('grid', 'size', epath))
      TkGrid.size(self)
    end

grid_slaves(keys = nil) click to toggle source

    # File lib/tk.rb, line 5445
    def grid_slaves(keys = nil)
      #list(tk_call('grid', 'slaves', epath, *hash_kv(args)))
      TkGrid.slaves(self, keys)
    end

inspect() click to toggle source
Calls superclass method

    # File lib/tk.rb, line 5186
    def inspect
      if @@WIDGET_INSPECT_FULL
        super
      else
        str = super
        str[0..(str.index(' '))] << '@path=' << @path.inspect << '>'
      end
    end

lower(below=None) click to toggle source

    # File lib/tk.rb, line 5574
    def lower(below=None)
      # below = below.epath if below.kind_of?(TkObject)
      below = _epath(below)
      tk_call 'lower', epath, below
      self
    end

Also aliased as: lower_window
lower_window(below=None)
Alias for: lower
pack(keys = nil) click to toggle source

    # File lib/tk.rb, line 5223
    def pack(keys = nil)
      #tk_call_without_enc('pack', epath, *hash_kv(keys, true))
      if keys
        TkPack.configure(self, keys)
      else
        TkPack.configure(self)
      end
      self
    end

pack_config(slot, value=None) click to toggle source

    # File lib/tk.rb, line 5252
    def pack_config(slot, value=None)
      #if slot.kind_of? Hash
      #  tk_call 'pack', 'configure', epath, *hash_kv(slot)
      #else
      #  tk_call 'pack', 'configure', epath, "-#{slot}", value
      #end
      if slot.kind_of? Hash
        TkPack.configure(self, slot)
      else
        TkPack.configure(self, slot=>value)
      end
    end

Also aliased as: pack_configure
pack_configure(slot, value=None)
Alias for: pack_config
pack_forget() click to toggle source

    # File lib/tk.rb, line 5245
    def pack_forget
      #tk_call_without_enc('pack', 'forget', epath)
      TkPack.forget(self)
      self
    end

Also aliased as: unpack
pack_in(target, keys = nil) click to toggle source

    # File lib/tk.rb, line 5233
    def pack_in(target, keys = nil)
      if keys
        keys = keys.dup
        keys['in'] = target
      else
        keys = {'in'=>target}
      end
      #tk_call 'pack', epath, *hash_kv(keys)
      TkPack.configure(self, keys)
      self
    end

pack_info() click to toggle source

    # File lib/tk.rb, line 5266
    def pack_info()
      #ilist = list(tk_call('pack', 'info', epath))
      #info = {}
      #while key = ilist.shift
      #  info[key[1..-1]] = ilist.shift
      #end
      #return info
      TkPack.info(self)
    end

pack_propagate(mode=None) click to toggle source

    # File lib/tk.rb, line 5276
    def pack_propagate(mode=None)
      #if mode == None
      #  bool(tk_call('pack', 'propagate', epath))
      #else
      #  tk_call('pack', 'propagate', epath, mode)
      #  self
      #end
      if mode == None
        TkPack.propagate(self)
      else
        TkPack.propagate(self, mode)
        self
      end
    end

pack_slaves() click to toggle source

    # File lib/tk.rb, line 5291
    def pack_slaves()
      #list(tk_call('pack', 'slaves', epath))
      TkPack.slaves(self)
    end

place(keys) click to toggle source

    # File lib/tk.rb, line 5450
    def place(keys)
      #tk_call 'place', epath, *hash_kv(keys)
      TkPlace.configure(self, keys)
      self
    end

place_config(slot, value=None) click to toggle source

    # File lib/tk.rb, line 5475
    def place_config(slot, value=None)
      #if slot.kind_of? Hash
      #  tk_call 'place', 'configure', epath, *hash_kv(slot)
      #else
      #  tk_call 'place', 'configure', epath, "-#{slot}", value
      #end
      TkPlace.configure(self, slot, value)
    end

Also aliased as: place_configure
place_configinfo(slot = nil) click to toggle source

    # File lib/tk.rb, line 5485
    def place_configinfo(slot = nil)
      # for >= Tk8.4a2 ?
      #if slot
      #  conf = tk_split_list(tk_call('place', 'configure', epath, "-#{slot}") )
      #  conf[0] = conf[0][1..-1]
      #  conf
      #else
      #  tk_split_simplelist(tk_call('place',
      #                             'configure', epath)).collect{|conflist|
      #   conf = tk_split_simplelist(conflist)
      #   conf[0] = conf[0][1..-1]
      #   conf
      #  }
      #end
      TkPlace.configinfo(self, slot)
    end

place_configure(slot, value=None)
Alias for: place_config
place_forget() click to toggle source

    # File lib/tk.rb, line 5468
    def  place_forget
      #tk_call 'place', 'forget', epath
      TkPlace.forget(self)
      self
    end

Also aliased as: unplace
place_in(target, keys = nil) click to toggle source

    # File lib/tk.rb, line 5456
    def place_in(target, keys = nil)
      if keys
        keys = keys.dup
        keys['in'] = target
      else
        keys = {'in'=>target}
      end
      #tk_call 'place', epath, *hash_kv(keys)
      TkPlace.configure(self, keys)
      self
    end

place_info() click to toggle source

    # File lib/tk.rb, line 5502
    def place_info()
      #ilist = list(tk_call('place', 'info', epath))
      #info = {}
      #while key = ilist.shift
      #  info[key[1..-1]] = ilist.shift
      #end
      #return info
      TkPlace.info(self)
    end

place_slaves() click to toggle source

    # File lib/tk.rb, line 5512
    def place_slaves()
      #list(tk_call('place', 'slaves', epath))
      TkPlace.slaves(self)
    end

raise(above=None) click to toggle source

    # File lib/tk.rb, line 5581
    def raise(above=None)
      #above = above.epath if above.kind_of?(TkObject)
      above = _epath(above)
      tk_call 'raise', epath, above
      self
    end

Also aliased as: raise_window
raise_window(above=None)
Alias for: raise
release_grab()
Alias for: grab_release
set_focus(force=false) click to toggle source

    # File lib/tk.rb, line 5517
    def set_focus(force=false)
      if force
        tk_call_without_enc('focus', '-force', path)
      else
        tk_call_without_enc('focus', path)
      end
      self
    end

Also aliased as: focus
set_global_grab()
Alias for: grab_set_global
set_grab()
Alias for: grab_set
thread_tkwait()
Alias for: thread_wait_visibility
thread_tkwait_destroy()
Alias for: thread_wait_destroy
thread_tkwait_visibility()
Alias for: thread_wait_visibility
thread_tkwait_window()
Alias for: thread_wait_destroy
thread_wait()
Alias for: thread_wait_visibility
thread_wait_destroy() click to toggle source

    # File lib/tk.rb, line 5675
    def thread_wait_destroy
      wait_destroy(true)
    end

Also aliased as: thread_wait_window, thread_tkwait_destroy, thread_tkwait_window
thread_wait_visibility() click to toggle source

    # File lib/tk.rb, line 5650
    def thread_wait_visibility
      wait_visibility(true)
    end

Also aliased as: thread_wait, thread_tkwait, thread_tkwait_visibility
thread_wait_window()
Alias for: thread_wait_destroy
tktrans_get_image() click to toggle source

    # File lib/tkextlib/tktrans/tktrans.rb, line 38
    def tktrans_get_image()
      tk_send('tktrans::setwidget', @path)
    end

tktrans_set_image(img) click to toggle source

    # File lib/tkextlib/tktrans/tktrans.rb, line 34
    def tktrans_set_image(img)
      tk_send('tktrans::setwidget', @path, img)
      self
    end

tkwait(on_thread = true)
Alias for: wait_visibility
tkwait_destroy(on_thread = true)
Alias for: wait_destroy
tkwait_window(on_thread = true)
Alias for: wait_destroy
ungrid()
Alias for: grid_forget
unpack()
Alias for: pack_forget
unplace()
Alias for: place_forget
wait(on_thread = true)
Alias for: wait_visibility
wait_destroy(on_thread = true) click to toggle source

    # File lib/tk.rb, line 5662
    def wait_destroy(on_thread = true)
      on_thread &= (Thread.list.size != 1)
      if on_thread
        INTERP._thread_tkwait('window', epath)
      else
        INTERP._invoke('tkwait', 'window', epath)
      end
    end

Also aliased as: wait_window, tkwait_destroy, tkwait_window
wait_visibility(on_thread = true) click to toggle source

    # File lib/tk.rb, line 5639
    def wait_visibility(on_thread = true)
      on_thread &= (Thread.list.size != 1)
      if on_thread
        INTERP._thread_tkwait('visibility', path)
      else
        INTERP._invoke('tkwait', 'visibility', path)
      end
    end

Also aliased as: wait, tkwait
wait_window(on_thread = true)
Alias for: wait_destroy

### Private Instance Methods

create_self(keys) click to toggle source

    # File lib/tk.rb, line 5143
    def create_self(keys)
      # may need to override
      begin
        cmd = self.class::TkCommandNames[0]
        fail unless (cmd.kind_of?(String) && cmd.length > 0)
      rescue
        fail RuntimeError, "class #{self.class} may be an abstract class"
      end

      if keys and keys != None
        unless TkConfigMethod.__IGNORE_UNKNOWN_CONFIGURE_OPTION__
          tk_call_without_enc(cmd, @path, *hash_kv(keys, true))
        else
          begin
            tk_call_without_enc(cmd, @path, *hash_kv(keys, true))
          rescue => e
            tk_call_without_enc(cmd, @path)
            keys = __check_available_configure_options(keys)
            unless keys.empty?
              begin
                # try to configure
                configure(keys)
              rescue
                # fail => includes options adaptable when creation only?
                begin
                  tk_call_without_enc('destroy', @path)
                rescue
                  # cannot rescue options error
                  fail e
                else
                  # re-create widget
                  tk_call_without_enc(cmd, @path, *hash_kv(keys, true))
                end
              end
            end
          end
        end
      else
        tk_call_without_enc(cmd, @path)
      end
    end