#!/apps/bin/wish -f #This is a Tcl script that reads the contents of a data file. #It reads every few seconds (defined by readinterval) #The file is assumed to consist of two entries per line #separated by a colon (no blank lines!). #Note also that the wish path is different #for different machines; Usually /usr/local/bin/wish # #Sep 1995 Derek van Westrum (vanwestr@colorado.edu) # #First check to see if filename and run# given as arguments... if {$argc != 2} { puts stderr "Wrong number of arguments." puts stderr "Usage: 'runstats filename run#'" puts stderr "Trying something..." if {$argc == 1} { set file [lindex $argv 0] if [catch {open $file r} FileId] { puts stderr "Cannot find file: $file" puts stderr "Check file name and path." puts stderr "Trying 'stats.txt'..." set file "stats.txt" if [catch {open $file r} FileId] { puts stderr "Nope. 'stats.txt' not there. Exiting..." exit } else { set FileId [open $file r] set fileline [split [read $FileId] \n:] puts stdout "Setting Run Number to 0000..." set runnum "0000" } } else { set FileId [open $file r] set fileline [split [read $FileId] \n:] puts stdout "Setting Run Number to 0000..." set runnum "0000" } } else { set file "stats.txt" if [catch {open $file r} FileId] { puts stderr "Nope. 'stats.txt' not there. Exiting..." exit } else { set FileId [open $file r] set fileline [split [read $FileId] \n:] puts stdout "Setting Run Number to 0000..." set runnum "0000" } } } #Now set the file name as the 1st argument in the command line... if {$argc == 2} { set file [lindex $argv 0] set runnum [lindex $argv 1] if [catch {open $file r} FileId] { puts stderr "Cannot find file: $file" puts stderr "Check file name and path." puts stderr "Trying 'stats.txt'..." set file "stats.txt" if [catch {open $file r} FileId] { puts stderr "Nope. 'stats.txt' not there. Exiting..." exit } else { set FileId [open $file r] set fileline [split [read $FileId] \n:] puts stdout "Setting Run Number to 0000..." set runnum "0000" } } else { set FileId [open $file r] set fileline [split [read $FileId] \n:] } } #Then set the read interval in ms set readinterval 2000 #Now find the number of lines in the file. #This is done by counting colons. Blank lines #will screw this up! set lines [exec grep -c ":" $file] #Now setup the main window wm title . "Statistics: Run # $runnum" wm minsize . 50 4 #Setup the button bar #The read button will run the process Read. See below frame .buttons -borderwidth 4 -relief ridge pack .buttons -side top -fill x button .buttons.quit -text Quit -command exit button .buttons.read -text Read -command Read pack .buttons.read -side left pack .buttons.quit -side right #Now setup two fields for each line in the file #The variable names will be raised on the left #The values will be sunken on the right frame .field pack .field -side bottom -expand true -fill both -padx 10 -pady 10 frame .field.var pack .field.var -side left -fill y -expand true frame .field.val pack .field.val -side right -fill y -expand true for {set i 1} {$i <= $lines } {incr i 1} { set temp [expr 2*$i -2] set mylabl [lindex $fileline $temp] set mylabl [string trimright $mylabl] if {[string length $mylabl]==0} { label .field.var.var$i -width 13 -anchor e -padx 2 label .field.val.val$i -width 8 } else { label .field.var.var$i -width 15 -anchor e -padx 2 label .field.val.val$i -relief sunken -width 8 -bg DarkGoldenrod3 .field.var.var$i config -text $mylabl: -padx 10 -anchor e } pack .field.var.var$i -side top -expand true pack .field.val.val$i -side top -expand true } #The process Read will go through "fileline" picking out the # values which are in the "even" positions. Read will execute #when it's called by the loop below, or when the read button #is pressed. proc Read {} { global lines file fileline set FileId [open $file r] set fileline [split [read $FileId] \n:] for {set i 1} {$i <=$lines } {incr i 1} { set temp [expr 2*$i -1] .field.val.val$i config -text [lindex $fileline $temp] \ -padx 10 -anchor w } #Now change the color of the background quickly to #indicate that the file is being read. # for {set i 1} {$i <=$lines } {incr i 1} { # .field.val.val$i config -bg Grey # } # after 2 { # for {set i 1} {$i <=$lines } {incr i 1} { # .field.val.val$i config -bg LightGrey # } # } close $FileId } #Now define a recursive (general) process that runs #a procedure every "interval" ms proc loopdeloop { process interval } { $process after $interval [list loopdeloop $process $interval] } #Now keep reading... loopdeloop Read $readinterval close $FileId