Tcl/Tk 进度系统 可以点状态与时间

来源:互联网 发布:程序员数学 编辑:程序博客网 时间:2024/04/30 23:18


#!/bin/sh
# -*- tcl -*- \
exec tclsh "$0"  ${1+"$@"}
 
package require Iwidgets

set p8 .label
toplevel $p8
set ecn_dir "d://ecn"

global  loger
set loger zd
array set phase {
0  "\u63A5 \u6536"
1  "Proc1"
2  "Proc2"
3  "\u5DE5 \u6536"
4  "\u5BE9\u6838\u7D50\u6848"
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
proc game_over {} {
 global ecn_dir  p8
 set job [$p8.frame1.jobname getcurselection]
 source [file join $ecn_dir $job]
 for {set i 0} {$i < 4} {incr i} {
  if {[lindex [set [set job]($i)] 0] == "x"} {return 1}
 }
 if {[lindex [set [set job](4)] 0] == "x"} {
  return 1
 } else {
  return 0
 }

}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
proc write_job {job index butt} {
 global ecn_dir loger
 source [file join $ecn_dir $job]
 set now_date [clock format [clock seconds] -format %m%/%d%#%H:%M:%S]
 if {$butt == 0} {
  set [set job]($index) [list $now_date $loger x x]
 } else {
  set [set job]($index) [list [lindex [set [set job]($index)] 0] [lindex [set [set job]($index)] 1] $now_date $loger]
 }
 set ecn_bakjob [open $ecn_dir/$job.tmp a+]
 set ecn_openjob [open $ecn_dir/$job r+]
 gets $ecn_openjob line
 puts -nonewline $ecn_bakjob $line\n
 for {set i 0} {$i < 5} {incr i} {
  puts -nonewline $ecn_bakjob [list $i   [set [set job]($i)] ]\n
 }
 puts -nonewline $ecn_bakjob \}
 puts -nonewline \n
 close $ecn_bakjob
 close $ecn_openjob
 file rename -force "$ecn_dir/$job.tmp" "$ecn_dir/$job"

}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
proc click_proc {loger} {
 global p8 ecn_dir phase deal_job index
 set deal_job [$p8.frame1.jobname getcurselection]
 set deal_state [$p8.frame1.state get]
 source [file join $ecn_dir $deal_job]                           
                set mingzi [array names db_p]
                set suv 0

                foreach name $mingzi {
                             if {[lindex $db_p($name) 0] ==  $loger &&  [lindex $db_p($name) 3] == "suv" ||  [lindex $db_p($name) 0]  == "suv1" }    { set  suv 1} { puts "welcome"}
               }


######[lindex [set [set deal_job](0)] 0] 这里deal_job不是直接数组名###
######[lindex [set deal_job(0)] 0] 这里deal_job是直接数组名###

 switch -- $deal_state {
 "\u63A5 \u6536" {if {[lindex [set [set deal_job](0)] 0] != "x"} {
    $p8.frame1.startbut configure -state disabled
   } else {
    $p8.frame1.startbut configure -state normal
   }
                                 if {[lindex [set [set deal_job](0)] 2] != "x"} {
    $p8.frame1.endbut configure -state disabled
   } else {
    $p8.frame1.endbut configure -state normal
   }
                set index 0
                }
 "Proc1"  {if {[lindex [set [set deal_job](1)] 0] != "x"} {
    $p8.frame1.startbut configure -state disabled
   } else {
    $p8.frame1.startbut configure -state normal
   }
     if {[lindex [set [set deal_job](1)] 2] != "x"} {
    $p8.frame1.endbut configure -state disabled
   } else {
    $p8.frame1.endbut configure -state normal
   }
   set index 1
   }
 "Proc2"  {if {[lindex [set [set deal_job](2)] 0] != "x"} {
    $p8.frame1.startbut configure -state disabled
   } else {
    $p8.frame1.startbut configure -state normal
   }
     if {[lindex [set [set deal_job](2)] 2] != "x"} {
    $p8.frame1.endbut configure -state disabled
   } else {
    $p8.frame1.endbut configure -state normal
   }
   set index 2
   }
 "\u5DE5 \u6536"    {if {[lindex [set [set deal_job](3)] 0] != "x"} {
    $p8.frame1.startbut configure -state disabled
   } else {
    $p8.frame1.startbut configure -state normal
   }
     if {[lindex [set [set deal_job](3)] 2] != "x"} {
    $p8.frame1.endbut configure -state disabled
   } else {
    $p8.frame1.endbut configure -state  normal
   }
   set index 3
   }
"\u5BE9\u6838\u7D50\u6848"  {if {[lindex [set [set deal_job](4)] 0] != "x"} {
    $p8.frame1.startbut configure -state disabled
   } else {
    $p8.frame1.startbut configure -state normal
   }
                                                 if {$suv == 1 && [lindex [set [set deal_job](4)] 2] == "x"}  {
                      $p8.frame1.endbut configure -state normal
                  } else {
                    $p8.frame1.endbut configure -state disabled
   }
   set index 4
   }
 }
 return $index

}

#console show

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
proc write_job_state {  } {
    global p8 ecn_dir loger rlist
    set sta $rlist 
puts "sta: $sta"
  foreach job_st $sta {
     set num [lsearch $sta $job_st]
     source [file join $ecn_dir $job_st]
     if {[lindex [set [set job_st](3)] 2] != "x"}  {
           set win [$p8.frame2 childsite]
           $win.main itemconfigure p4$num -fill red
          
} elseif {[lindex [set [set job_st](2)] 2] != "x"}  {
           set win [$p8.frame2 childsite]
           $win.main itemconfigure p3$num -fill red
          
} elseif {[lindex [set [set job_st](1)] 2] != "x"}  {
           set win [$p8.frame2 childsite]
           $win.main itemconfigure p2$num -fill red
          
} elseif {[lindex [set [set job_st](0)] 2] != "x"}  {
           set win [$p8.frame2 childsite]
           $win.main itemconfigure p1$num -fill red
           }
   }

}
#########################################################
proc read_job {} {
 global p8 ecn_dir phase stard row column rlist
   set win [$p8.frame2 childsite]
 set list "" ; set rlist ""
 foreach job [glob -directory [file join $ecn_dir] -nocomplain *] {
  set job [lindex [split $job /] end]
  lappend list [list $job [file mtime [file join $ecn_dir $job]]]
 }

set column [list [lsort -index 1 -increasing $list]]
puts "column: $column"
 foreach ecn [lsort -index 1 -increasing $list] {
  lappend rlist [lindex $ecn 0]
  $p8.frame1.jobname  insert list end  [lindex $ecn 0]
 }

 $win.main delete all
 set j 0
                set t_now [clock scan [join [split [join [split [clock format  [clock seconds] -format "%y%/%m%/%d%#%H:%M:%S"] #] T] /] ""]]
 foreach ecnrange $rlist {
  source [file join $ecn_dir $ecnrange]
  $win.main create rect 3 [expr 8+$j*38] 100 [expr 28+$j*38] -fill yellow  -outline blue -tags $ecnrange
  $win.main create text 53 [expr 18+$j*38]  -text  "$phase(0)" -font {courier 8 bold} -tags $ecnrange
  #set spend_t [expr $t_now - [t_tran [lindex [set [set ecnrange](0)] 0] ]]
  for {set i 1} {$i < 5} {incr i} {
   $win.main create rect [expr $i*100] [expr 8+$j*38] [expr ($i+1)*100] [expr 28+$j*38] -fill ""  -outline blue -tags p$i$j
   $win.main create text [expr $i*100+50.0] [expr 18+$j*38]  -text  "$phase($i)" -font {courier 10 bold} -tags $ecnrange
lappend ary [list p$i$j]
set row $ary


  }
  $win.main create text 505 [expr 18+$j*38]  -text $ecnrange  -font {courier 10 bold} -anchor w -tags $ecnrange
  incr j

 }
 $win.main  configure -height [expr $j*38+25]
write_job_state

return $row ; return $rlist

}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
proc new {} {
 global p8 phase loger ecn_dir
 set ecn_job [$p8.frame1.label.ent get]
puts $ecn_job
 $p8.frame1.jobname  insert list end  $ecn_job
 set list [lsort [glob -directory [file join $ecn_dir] -nocomplain *]]
 set j [llength $list]
 if {$ecn_job == ""} {
  tk_messageBox -icon error -message "please enter job name !"
  return
 } else {
  destroy $p8.frame1.label
 }
   set win [$p8.frame2 childsite]
 set now_date [clock format [clock seconds] -format %m%/%d%#%H:%M:%S]

 if {[file exists "$ecn_dir/$ecn_job"]} {
  set open_ecn [open "$ecn_dir/$ecn_job" r+]
 } else {
  set open_ecn [open "$ecn_dir/$ecn_job" a+]
 }
 puts -nonewline $open_ecn "array set $ecn_job \{"
 puts  -nonewline $open_ecn \n
 $win.main  create rect 3 [expr 8+$j*38] 100 [expr 28+$j*38]  -fill yellow -tags $ecn_job
 $win.main create text 53  [expr 18+$j*38]    -text  "$phase(0)" -font {courier 10 bold} -tags $ecn_job
 puts -nonewline $open_ecn "0   {$now_date $loger x x }"
 puts  -nonewline $open_ecn \n
 for {set i 1} {$i < 5} {incr i} {
  $win.main create rect [expr $i*100] [expr 8+$j*38] [expr ($i+1)*100] [expr 28+$j*38] -fill ""  -outline blue -tags $ecn_job$j$i
  $win.main create text [expr $i*100+50.0] [expr 18+$j*38]  -text  "$phase($i)" -font {courier 10 bold} -tags $ecn_job
  puts -nonewline $open_ecn "$i   { x x x x }"
  puts -nonewline $open_ecn \n
 }
 $win.main create text 505 [expr 18+$j*38]  -text $ecn_job  -font {courier 10 bold} -anchor w -tags $ecn_job
 puts -nonewline $open_ecn "\}"
 close $open_ecn
 $win.main  configure -height [expr $j*38+30]


}

proc delete {} {
 global p8  ecn_dir
 set list "" ; set rlist ""
 foreach job [glob -directory [file join $ecn_dir] -nocomplain *] {
  set job [lindex [split $job /] end]
  lappend list [list $job [file mtime [file join $ecn_dir $job]]]
 }
 foreach ecn [lsort -index 1 -increasing $list] {
  lappend rlist [lindex $ecn 0]
  $p8.frame1.labeldel.entdel  insert list end  [lindex $ecn 0]
 }

 $p8.frame1.labeldel.del configure -command {
 set ecn_job  [$p8.frame1.labeldel.entdel get]
 if {$ecn_job != ""} {
 if {[file exists  "$ecn_dir/$ecn_job" ]} {
  file delete -force "$ecn_dir/$ecn_job"
  destroy $p8.frame1.labeldel
 } else {
  tk_messageBox -icon error -message "please enter a exists job name !"
  destroy $p8.frame1.labeldel
  return
 }
 } else {
  tk_messageBox -icon error -message "please enter job name !"
  destroy $p8.frame1.labeldel
  return
 }

 }

}

proc sub_ecn_score_count {jobname} {
      set ecn_score d:/score
     set ecn_donefile "d:/ecn_done"


 source [file join $ecn_donefile $jobname ]
      set timeout 0
      set s_time  [lindex [set [set jobname ](1)] 0]
      set e_time [lindex [set [set jobname ](4)] 0] 
      set start_time [ clock scan [split  $s_time # ] ]
      set end_time [ clock scan  [split $e_time # ] ]
 
      if  {[expr $end_time-$start_time ] > 345600 } {
             set timeout 1
     }
 
     for {set i 0} {$i <= 4} {incr i} {
           if {$i != 0 && $i != 4} {
                   if {$i == 1 } {
                          if {$timeout == 0} {
                                 set score1 0.3
                                 set score2 0.1
                          } else {
                                 set score1 0.1
                                 set score2 0.1
                          }                                 
                   } else {
                              if {$i == 2} {
                                     set score1 0.1
                                     set score2 0.1
                              }
                               if {$i == 3} {
                                     set score1 0.1
                                     set score2 0.1
                              }
                     }
                   set time1 [lindex [set [set jobname ]($i)] 0]
                   set loger1  [lindex [set [set jobname ]($i)] 1]
                   set time2 [lindex [set [set jobname ]($i)] 2]
                   set loger2  [lindex [set [set jobname ]($i)] 3]
                   if {![file isdirectory $ecn_score]} {file mkdir "$ecn_score"}
    if {![file isdirectory $ecn_score/$loger1]} {file mkdir "$ecn_score/$loger1"}
    if {![file isdirectory $ecn_score/$loger2]} {file mkdir "$ecn_score/$loger2"}
 
                   if { $loger1  == $loger2 } {
                           if {![file exists $ecn_score/$loger1/$loger1]}  {
                                    set score_db [open $ecn_score/$loger1/$loger1 a+]
                           } else {
                                    set score_db [open $ecn_score/$loger1/$loger1 r+]
                           }
                           set tag1 1
                           while {![eof $score_db]} {
                                     gets $score_db line
                                      if {[lindex $line 0] == [list $jobname/$i] && $loger1 == [lindex $line 8]} {
                                              set tag1 -1
                                              break
                                        }
                             }
                          if {$tag1 == 1 && ![file exists $score_db]} {
                               puts  -nonewline $score_db [list $jobname/ECN/$i , $time1 , [expr $score1+$score2] , $time2 , $loger1 , $loger2 , [expr $score1+$score2] ]\n
                           } else {
                               tk_messageBox -message "EXISTS!"
                                break
                           }
                              close $score_db
                   } else {
                            if {![file exists $ecn_score/$loger1/$loger1]}  {
                                    set score_db [open $ecn_score/$loger1/$loger1 a+]
                           } else {
                                    set score_db [open $ecn_score/$loger1/$loger1 r+]
                           }
                           set tag1 1
                           while {![eof $score_db]} {
                                      gets $score_db line
                                      if {[lindex $line 0] == [list $jobname/$i] && $loger1 == [lindex $line 8]} {
                                              set tag1 -1
                                              break
                                        }
                             }
                          if {$tag1 == 1 && ![file exists $score_db]} {
                            puts  -nonewline $score_db [list $jobname/ECN/$i , $time1 , [expr $score1+$score2] , x , $loger1 , $loger2 , $score1]\n              
                            } else {
                              tk_messageBox -message "EXISTS!"
                                break
                           }
                              close $score_db
 
                            if {![file exists $ecn_score/$loger2/$loger2]}  {
                                    set score_db [open $ecn_score/$loger2/$loger2 a+]
                           } else {
                                    set score_db [open $ecn_score/$loger2/$loger2 r+]
                           }
                           set tag1 1
                           while {![eof $score_db]} {
                                      gets $score_db line
                                      if {[lindex $line 0] == [list $jobname/$i] && $loger2 == [lindex $line 8]} {
                                              set tag1 -1
                                              break
                                        }
                             }
                          if {$tag1 == 1 && ![file exists $score_db]} {
                           puts  -nonewline $score_db [list $jobname/ECN/$i , x , x , $time2 , $loger1 , $loger2 , $score2]\n                 
                           } else {
                               tk_messageBox -message "EXISTS!"
                                break
                           }
                           close $score_db
                  }
           }
      }
 
}
 

proc main_frame {} {
 global p8 ecn_dir row column rlist
       console show
 pack [frame $p8.frame1 -width 640] -side top
 pack [button $p8.frame1.new -width 7 -text "Add Job" -font {courier 8 bold}]  -side left
 pack [button $p8.frame1.del -width 7 -text "Del Job" -font {courier 8 bold}]  -side left

 pack [label $p8.frame1.txt -text "JobName: " -font {courier 11 bold}] -side left
 pack [iwidgets::combobox $p8.frame1.jobname  -width 20 -selectioncommand {click_proc $loger ;puts $index} ] -side left
 pack [iwidgets::optionmenu $p8.frame1.state -width 80 -command {click_proc $loger ;puts $index} ] -side left

 pack [button $p8.frame1.startbut -width 12 -text "\u958B \u59CB" -font {courier 10 bold}] -side left
 pack [button $p8.frame1.endbut -width 12 -text "\u7D50 \u675F" -font {courier 10 bold}] -side left
 $p8.frame1.new configure -command {
  place [frame $p8.frame1.label -width 200 -height 40 -bg green ] -x 1 -y 1
  place [entry $p8.frame1.label.ent -width 15] -x 1 -y 5
  place [button $p8.frame1.label.ok -text "O  K" -width 5 -command  new] -x 100 -y 4 
  place [button $p8.frame1.label.cancel -text "Cancel" -width 5 -command "destroy $p8.frame1.label"] -x 150 -y 4
 }

 $p8.frame1.del configure -command {
  place [frame $p8.frame1.labeldel -width 250 -height 40 -bg green ] -x 1 -y 1
  place [iwidgets::combobox $p8.frame1.labeldel.entdel -width 12] -x 1 -y 5
  place [button $p8.frame1.labeldel.del -text "Delete" -width 5 ] -x 100 -y 4
  place [button $p8.frame1.labeldel.cancel -text "Cancel" -width 5 -command "destroy $p8.frame1.labeldel"] -x 150 -y 4

  delete

 }
 $p8.frame1.state  insert end "\u63A5 \u6536" "Proc1"  "Proc2"  "\u5DE5 \u6536"   "\u5BE9\u6838\u7D50\u6848"
 pack [iwidgets::scrolledframe  $p8.frame2 -width 640 -height 285] -side bottom
   set win [$p8.frame2 childsite]
 pack [canvas $win.main -width 700 -height 285 -relief sunken -bd 0]
 read_job
 $p8.frame1.startbut configure -command {
  write_job [$p8.frame1.jobname getcurselection] [click_proc  $loger] 0
  $p8.frame1.startbut configure -state disabled 
 }
 $p8.frame1.endbut configure -command {
  if {[$p8.frame1.state get] == $phase(4)} {
   if {[game_over] == 0} {
    set current_job [$p8.frame1.jobname getcurselection] 
    write_job $current_job [click_proc $loger] 1
                                                                file copy -force  $ecn_dir/$current_job d:/ecn_done
    file delete -force "$ecn_dir/$current_job"
                                                                read_job
                                                                sub_ecn_score_count $current_job
                                                     }
  } else { 
   write_job [$p8.frame1.jobname getcurselection]  [click_proc $loger] 1

set flow [$p8.frame1.state get]
set dex [$p8.frame1.jobname getcurselection]
global num
set view $rlist
     set num [lsearch $view $dex]
switch -- $flow {

     "\u63A5 \u6536" { set win [$p8.frame2 childsite]
                       $win.main itemconfigure p1$num -fill red }
 
        "Proc1"      { set win [$p8.frame2 childsite]
                       $win.main itemconfigure p1$num -fill ""
                       $win.main itemconfigure p2$num -fill red }
       
   "Proc2"      { set win [$p8.frame2 childsite]
                       $win.main itemconfigure p2$num -fill ""
                       $win.main itemconfigure p3$num -fill red }
       
    "\u5DE5 \u6536"  { set win [$p8.frame2 childsite]
                       $win.main itemconfigure p3$num -fill ""
                       $win.main itemconfigure p4$num -fill red }  
   }
                                                             
  }
  $p8.frame1.endbut configure -state disabled

 }


}
main_frame

0 0
原创粉丝点击