itk_component packed in the subclass

class Balloonwidget {
    inherit itk::Widget

    itk_option define -balloonhelp balloonHelp BalloonHelp ""

    private variable balloon_queue ""
    private variable destroy_queue ""

    public method enter
    public method leave
    public method balloon

    constructor { args } {
 bind $itk_component(hull) <Enter> [code $this enter]
 bind $itk_component(hull) <Leave> [code $this leave]
 eval itk_initialize $args }
}

body Balloonwidget::enter { } {
    if {$balloon_queue != ""} {
 after cancel $balloon_queue
    }
    if {$itk_option(-balloonhelp) != ""} {
 set balloon_queue [after 750 [code $this balloon]]
    }
}

body Balloonwidget::leave { } {
    if {$balloon_queue != ""} {
 after cancel $balloon_queue
    }
    set destroy_queue [after 100 {catch {destroy .balloon_help}}]
}

body Balloonwidget::balloon { } {
    set t .balloon_help
    catch {destroy $t}
    toplevel $t
    wm overrideredirect $t 1

    if {[tk windowingsystem] == "aqua"} {
 #unsupported1 style $itk_component(hull) floating sideTitlebar
 ::tk::unsupported::MacWindowStyle style $t help none
    }

    label $t.l \
    -text " $itk_option(-balloonhelp) " \
 -relief solid \
 -bd 2 \
 -bg gold \
 -fg #000000 \
 -font font_b
    pack $t.l -fill both
    set x [expr [winfo pointerx $itk_component(hull)] + 8]
    set y [expr [winfo pointery $itk_component(hull)] + 20]
    if {[expr $x + [winfo reqwidth $t.l]] > [winfo screenwidth $t.l]} {
    set x [expr [winfo screenwidth $t.l] - [winfo reqwidth $t.l] - 2]
    }
    if {[expr $y + [winfo reqheight $t.l]] > [winfo screenheight $t.l]} {
    set y [expr $y - 20 - [winfo reqheight $t.l] - 2]
    }
    wm geometry $t +$x\+$y
    #bind $t <Enter> [list [after cancel $destroy_queue]]
    #bind $t <Leave> "catch {destroy .balloon_help}"
}


class gEntry {
    inherit Balloonwidget

    itk_option define -image image Image "" {
 if {$itk_option(-image) != ""} {
     $itk_component(icon) configure \
  -image $itk_option(-image) \
  -width [expr [image width $itk_option(-image)] + 4] \
  -height [expr [image height $itk_option(-image)] + 4]
 }
    }

    itk_option define -padxy padXY Pad 0 {
 $itk_component(padding) configure -borderwidth $itk_option(-padxy)
    }
    itk_option define -disabledbackground disabledBackground Background "#dcdcdc"
    itk_option define -disabledforeground disabledForeground DisabledForeground "#a9a9a9"
    itk_option define -foreground foreground Foreground "#000000" {
 if {$itk_option(-state) != "disabled"} {
     $itk_component(entry) configure -foreground $itk_option(-foreground)
 }
    }
    itk_option define -textbackground textBackground Background "#ffffff" {
 if {$itk_option(-state) != "disabled"} {
     $itk_component(entry) configure -background $itk_option(-textbackground)
     $itk_component(icon) configure -background $itk_option(-textbackground)
 }
 $itk_component(frame) configure -background $itk_option(-textbackground)
    }
    itk_option define -entryfont entryFont Font font_e {
 $itk_component(entry) configure -font $itk_option(-entryfont)
    }
    itk_option define -state state State "normal" {
 if {$itk_option(-state) == "disabled"} {
     $itk_component(entry) configure \
  -state disabled \
  -background $itk_option(-disabledbackground) \
  -foreground $itk_option(-disabledforeground)
     $itk_component(frame) configure \
  -background $itk_option(-disabledbackground)
     $itk_component(icon) configure \
  -background $itk_option(-disabledbackground)
 } else {
     $itk_component(entry) configure \
  -state normal \
  -background $itk_option(-textbackground) \
  -foreground $itk_option(-foreground)
     $itk_component(frame) configure \
  -background $itk_option(-textbackground)
     $itk_component(icon) configure \
  -background $itk_option(-textbackground)
 }
    }
    itk_option define -type type Type "string"
    itk_option define -defaultvalue defaultValue DefaultValue ""
    itk_option define -precision precision Precision "2"
    itk_option define -maximum maximum Maximum ""
    itk_option define -minimum minimum Minimum ""
    itk_option define -allowblank allowBlank AllowBlank "1"
    itk_option define -linkcommand linkCommand Command ""
    itk_option define -editcommand editCommand Command ""
    itk_option define -command command Command ""

    public method validate
    public method focusOut
    public method update
    public method query
    public method keystroke

    constructor { args } {
 
 itk_component add padding {
     frame $itk_interior.p \
  -relief flat \
     }
 pack $itk_component(padding) -fill x
 
 itk_component add frame {
     frame $itk_interior.p.f \
  -borderwidth 2 \
  -relief sunken
 } {
     usual
      keep -borderwidth
      keep -relief
 }
 pack $itk_component(frame) -fill x
 
 itk_component add icon {
     label $itk_interior.p.f.icon \
  -anchor c \
  -padx 0 \
  -pady 0 \
  -bd 0
 }
 pack $itk_component(icon) -side left

 itk_component add entry {
     entry $itk_interior.p.f.entry \
  -relief flat \
  -borderwidth 0 \
  -highlightthickness 0 \
  -selectborderwidth 0 \
  -validate all \
  -validatecommand [code $this validate %V %P]
     } {
  keep -insertbackground -insertborderwidth -insertwidth
  keep -insertontime -insertofftime
  keep -selectbackground -selectforeground
  keep -textvariable
  keep -width
  keep -justify
  keep -show
     }
 pack $itk_component(entry) -side right -fill x -expand true
 
 bind $itk_component(entry) <FocusOut> [code $this focusOut]
 bind $itk_component(entry) <Return> [code $this focusOut]
 bind $itk_component(entry) <KeyPress> [code $this keystroke]

 eval itk_initialize $args
    }
   
}

body gEntry::query { } {
    return [$itk_component(entry) get]
}

body gEntry::update { a_value } {
    if {[validate "focusout" $a_value]} {
 $itk_component(entry) configure -state normal
 $itk_component(entry) delete 0 end
 $itk_component(entry) insert 0 $a_value
 $itk_component(entry) configure -state $itk_option(-state) 
 focusOut -nolink
    }
}

body gEntry::validate { reason new_string } {
    switch -- $reason {
 key {
     switch -- $itk_option(-type) {
  real {
      if {[regexp -- {^-?\d*\.?\d*$} $new_string]} {
   return 1
      } else {
   bell
   return 0
      }
  }
  int {
      if {[regexp -- {^-?\d*$} $new_string]} {
   return 1
      } else {
   bell
   return 0
      }
  }
  default {
      return 1
  }
     }
 }
 forced {
     # Trust myself to only force it to accept well-formed values
     return 1
 }
 focusout {
     switch -- $itk_option(-type) {
  real {
      if {[regexp -- {^-?\.?$} $new_string]} {set new_string ""}
      if {$new_string == ""} {
   if {$itk_option(-allowblank)} {
       return 1
   } elseif {$itk_option(-defaultvalue) != ""} {
       set new_string $itk_option(-defaultvalue)
   } else {
       set new_string 0
   }
      }
      if {$itk_option(-maximum) != ""} {
   if {$new_string > $itk_option(-maximum)} {
       set new_string $itk_option(-maximum)
   }
      }
      if {$itk_option(-minimum) != ""} {
   if {$new_string < $itk_option(-minimum)} {
       set new_string $itk_option(-minimum)
   }
      }
      $itk_component(entry) delete 0 end
      $itk_component(entry) insert 0 [format %.$itk_option(-precision)f $new_string]
      # Need to turn valistaion back on, as setting the entry content
      #  here will have turned it off.
      after idle [list $itk_component(entry) configure -validate all]
      return 1
  }
  int {
      if {[regexp -- {^-?$} $new_string]} {set new_string ""}
      if {$new_string == ""} {
   if {$itk_option(-allowblank)} {
       return 1
   } elseif {$itk_option(-defaultvalue) != ""} {
       set new_string $itk_option(-defaultvalue)
   } else {
       set new_string 0
   }
      }
      if {$itk_option(-maximum) != ""} {
   if {$new_string > $itk_option(-maximum)} {
       set new_string $itk_option(-maximum)
   }
      }
      if {$itk_option(-minimum) != ""} {
   if {$new_string < $itk_option(-minimum)} {
       set new_string $itk_option(-minimum)
   }
      }
      $itk_component(entry) delete 0 end
      $itk_component(entry) insert 0 $new_string
      # Need to turn validation back on, as setting the entry content
      #  here will have turned it off.
      after idle [list $itk_component(entry) configure -validate all]
      return 1
  }
  default {
      return 1
  }
     }
 }
 default {
     return 1
 }
    }
}

body gEntry::focusOut { { a_link "-link" } } {
    $itk_component(entry) selection clear
    if {$itk_option(-command) != ""} {
 uplevel #0 [list $itk_option(-command) "[$itk_component(entry) get]"]
    }
    if { $a_link != "-nolink" } {
 if {$itk_option(-linkcommand) != ""} {
     uplevel #0 $itk_option(-linkcommand)
 }
    }
}

body gEntry::keystroke { } {
    if  {$itk_option(-editcommand) != ""} {
 uplevel #0 $itk_option(-editcommand)
    }
}

usual gEntry {
   #rename -disabledbackground -background background Background
   keep -textbackground -background
   keep -selectforeground -selectbackground
   keep -disabledbackground -disabledforeground
   keep -entryfont
   keep -padxy
}

# ###############################################################################
# FILEENTRY
# ###############################################################################

class SettingWidget {
   
    # Common variables
    private common widgets ; # array 

    # Procedures
    public proc refresh { a_parameter }
    public proc refreshAll { }

    # Member variables
    protected variable parameter ""
    private variable old_value ""
 private variable canbeblank 0

   
    # Methods
    protected method getValue ; # virtual
    public method setValue ; # virtual
   
    public method downloadFromSession
    protected method uploadToSessionIfChanged

    constructor { a_parameter } { }

}

body SettingWidget::constructor { a_parameter } {
    set parameter $a_parameter
    lappend widgets($a_parameter) $this
}

body SettingWidget::refresh { a_parameter } {
    if {[info exists widgets($a_parameter)]} {
 foreach i_widget $widgets($a_parameter) {
     $i_widget downloadFromSession
 }
    }
}

body SettingWidget::refreshAll { } {
    foreach i_parameter [array names widgets] {
 refresh $i_parameter
    }
}
   
body SettingWidget::getValue { } { error "Virtual method SettingWidget::getValue not overridden" }

body SettingWidget::setValue { } { error "Virtual method SettingWidget::getValue not overridden" }

body SettingWidget::uploadToSessionIfChanged { } {

 #added by luke on 9 November 2007.
 # If one presses return in a setting entry while it is blank, the interpreter gave an error
 # See bug 42. The if statement below catches that case and leaves the old_value unchanged
 if {([getValue] == "") && ($canbeblank == 0)} {
 $::session updateSetting $parameter $old_value 1 1 
 }
 ####################################################### 
    # if the current value doesn't match the old value
    if {[getValue] != $old_value} {
 # update the session with the current value
 $::session updateSetting $parameter [getValue] 1 1
 # update the old value
 set old_value [getValue]

  #added by luke on 3 December 2007
  #A hack to send the detector and reversephi keywords. reversephi should only
  #be sent to ipmosflm if the detector manufacturer is already set.
  if {$parameter == "detector_manufacturer"} {
   $::mosflm sendCommand "detector $old_value"
  }
  if {$parameter == "reverse_phi"} {
   if {([$::session getReversePhi]) && ([$::session getDetectorManufacturer] != "")} {
    $::mosflm sendCommand "detector [$::session getDetectorManufacturer] reversephi"
   } else {
    $::mosflm sendCommand "detector [$::session getDetectorManufacturer]"
   }
  }
  ###################################################################
    } else {
    }
}

body SettingWidget::downloadFromSession { } {
    set l_new_value [$::session getParameterValue $parameter]
    set old_value $l_new_value
    setValue $l_new_value
}

class SettingEntry {
    inherit gEntry SettingWidget

#     itk_option define -parameter parameter Parameter "" {
#  set parameter $itk_option(-parameter)
#     }

    public method update
    public method getValue
    public method setValue
 public method publicUploadToSessionIfChanged

    constructor { a_parameter args } {
 eval gEntry::constructor $args
 SettingWidget::constructor $a_parameter
    } {
 bind $itk_component(entry) <FocusOut> +[code $this uploadToSessionIfChanged]
 bind $itk_component(entry) <Return> +[code $this uploadToSessionIfChanged]
    }
}

body SettingEntry::update { a_value } {
    gEntry::update $a_value
    uploadToSessionIfChanged
}

body SettingEntry::getValue { } {
    return [$itk_component(entry) get]
}

body SettingEntry::setValue { a_value } {
    $itk_component(entry) configure -state normal
    $itk_component(entry) delete 0 end
    $itk_component(entry) insert end $a_value
    $itk_component(entry) configure -state $itk_option(-state)
}

usual SettingEntry {
    usual gEntry
}

body SettingEntry::publicUploadToSessionIfChanged {} {
 uploadToSessionIfChanged
# puts "did it"
}


class Indexwizard {
    inherit itk::Widget
    constructor {args} { }

}

body Indexwizard::constructor { args } {

   

    # Toolbars ###############################################

    itk_component add spotfinding_toolbar {
 frame .c.spot
    }

    # Divider

    itk_component add spotfinding_divider1 {
 frame $itk_component(spotfinding_toolbar).div1 \
     -width 2 \
     -relief sunken \
     -bd 1
    }

    itk_component add beam_x_e {
 SettingEntry $itk_component(spotfinding_toolbar).bxe beam_x \
     -image ::img::beam_x16x16 \
     -balloonhelp "Beam x position" \
     -type real \
     -precision 2 \
     -width 6 \
     -justify right
    }

    itk_component add beam_y_e {
 SettingEntry $itk_component(spotfinding_toolbar).bye beam_y \
     -image ::img::beam_y16x16 \
     -balloonhelp "Beam y position" \
     -type real \
     -precision 2 \
     -width 6 \
     -justify right
    }

    itk_component add distance_e {
 SettingEntry $itk_component(spotfinding_toolbar).de distance \
     -image ::img::distance16x16 \
     -balloonhelp "Crystal to detector distance" \
     -type real \
     -precision 2 \
     -width 6 \
     -justify right
    }

    itk_component add spotfinding_divider2 {
 frame $itk_component(spotfinding_toolbar).div2 \
     -width 2 \
     -relief sunken \
     -bd 1
    }

    # Frames
#    pack $itk_component(spotfinding_toolbar) -side top -fill both
    # Spot finding panel
    ###############################################################
    grid $itk_component(spotfinding_toolbar) -row 0 -column 0  -sticky nswe
    pack $itk_component(spotfinding_divider1) -side top -fill both
    pack $itk_component(beam_x_e) -side top -fill both
    pack $itk_component(beam_y_e) -side top -fill both
    pack $itk_component(distance_e) -side top -fill both
 
    eval itk_initialize $args

}

# Launch and completion methods #####################################


usual Indexwizard {
}

#Indexwizard .c
#pack .c


class test {
 inherit itk::Widget
 constructor { args } {
  itk_option add hull.width hull.height
  
  $itk_component(hull) configure -width 1050 -height 768 
  wm minsize [winfo toplevel $itk_component(hull)] 1050 768
  pack propagate $itk_interior 0
  
  itk_component add spot {
         frame .c.spott
  }
  
  itk_component add index {
      Indexwizard $itk_component(spot).kk
  }
  
  itk_component add indexing {
      label $itk_component(spot).ttt \
   -text "aaaa"
  }
  
  pack $itk_component(spot) -side top -fill both
  grid $itk_component(spot) -row 1 -column 0  -sticky nswe
  pack $itk_component(indexing) -side top -fill both
#  pack $itk_component(index) -side top -fill both
  
 }
}
test .c
pack .c

原文地址:https://www.cnblogs.com/greencolor/p/2129546.html