天天看點

Tcl/Tk 進度系統 可以點狀态與時間

Tcl/Tk 進度系統 可以點狀态與時間



#!/bin/sh

# -*- tcl -*- \

exec tclsh "$0"  ${1+"[email protected]"}

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