2015-08-13 2 views
0

Я работаю над программным обеспечением, помогающим студентам. Цель состоит в том, чтобы иметь интерактивное программное обеспечение. В настоящее время у меня есть первый интерфейс с кнопками селектора, которые должны показывать учебные пособия. Я могу показать первый учебник, но если я хочу использовать кнопки «Назад» или «Далее», это не сработает. Я не понимаю, почему. Когда я нажимаю кнопку, процедура называется, код выглядит следующим образом:Как использовать кнопки «Назад» и «Далее»?

proc loadBackground {} { 
    #variables 
    set ::i 0 
    set close 0 
    set bgColour "White" 
    set fd [open [pwd]/content/background r] 
    set ::data [split [read $fd] \n] 
    close $fd 

#window definition 
toplevel .fr 
wm title .fr "Background" 
wm geometry .fr 660x550+0+105 
.fr configure -bg $bgColour 

# define the main text zone 
text .fr.txt -wrap word -yscroll {.fr.vscroll set} -highlightthickness 0 
scrollbar .fr.vscroll -orient vertical -command {.fr.txt yview} 
grid .fr.txt -column 0 -row 1 -sticky snwe 
grid .fr.vscroll -column 1 -row 1 -sticky snwe 

# define the canvas for interactive diagrams 
canvas .fr.canv -bg #f8f8f8 -yscrollcommand {.fr.vscroll set} -scrollregion "0 0 750 750" 

.fr.txt tag configure center -justify center 
.fr.txt configure -font "times 12" -state disabled 

.fr.vscroll configure -orient vertical -command {.fr.txt yview} 
grid .fr.txt -column 0 -row 1 -sticky snwe 
.fr.txt configure -state normal 
.fr.txt delete 1.0 end 

# title of section 
label .fr.titl 
.fr.titl configure -font "arial 20" -pady 10 
grid .fr.titl -column 0 -row 0 -sticky swe 
.fr.titl configure -background "White" 

#text styles 
.fr.txt tag configure Normal -font "times 12" 
.fr.txt tag configure subTitle -font "times 14" 
.fr.txt tag configure Titlec -font "times 16" -justify "center" 
.fr.txt tag configure subTitlec -font "times 14" -justify "center" 
.fr.txt tag configure subTitlecu -font "times 14" -justify "center" -underline on 
.fr.txt tag configure Titlecu -font "times 16" -justify "center" -underline on 
.fr.txt tag configure Title -font "times 16" 
.fr.txt tag configure link -foreground blue -font "times 12" 
.fr.txt tag configure right -foreground "forest green" 
.fr.txt tag configure wrong -foreground red 
.fr.txt tag configure enhance -background "light goldenrod" 
.fr.txt tag configure rightenhance -background "light goldenrod" -foreground "forest green" 
.fr.txt tag bind link <Enter> ".fr.txt configure -cursor hand1" 
.fr.txt tag bind link <Leave> ".fr.txt configure -cursor arrow" 

dispFile [lindex $::data $::i] 

#buttons definition 
frame .fr.bar 
grid .fr.bar -row 2 
button .fr.bar.bk -text "<< Back" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [expr $::i - 1]]} 
pack .fr.bar.bk -padx 5 -pady 5 -side left -fill none 
button .fr.bar.cl -text "Close" -pady 5 -borderwidth 0 -command { set close 1} 
pack .fr.bar.cl -padx 5 -pady 5 -side left -fill none 
button .fr.bar.nx -text "Next >>" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [expr $::i + 1]]} 
pack .fr.bar.nx -padx 5 -pady 5 -side right -fill none 

vwait close 
destroy .fr 
} 

процедуру, чтобы отобразить учебник (написано в файле) является:

proc dispFile {name} { 
    set flname "[pwd]/Files/$name" 
    set infile [open $flname "r"] 
    set inEOF -1 
    set txln "" 
    set lkcount 0 
    set counter 0 

    while {[gets $infile inln] != $inEOF} { 
     switch $inln { 
      "<Title>" { 
       gets $infile inln 
       .fr.titl configure -text $inln 
      } 
      "<subTitle>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitle 
      } 
      "<subTitlec>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitlec 
      } 
      "<subTitlecu>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitlecu 
      } 
      "<Titlec>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlec 
      } 
      "<Titlecu>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlecu 
      } 
      "<Highlight>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlecu 
      } 
      "<hyperlink>" { 
       gets $infile inln 
       .fr.txt insert end "$inln" "link lk$lkcount" 
       .fr.txt insert end "\n" Normal 
       gets $infile inln 
       .fr.txt tag bind lk$lkcount <1> "openPDF Files/$inln" 
       incr lkcount 
      } 
      "<hypLink>" { 
       gets $infile inln 
       .fr.txt insert end "$inln" "link lk$lkcount" 
       .fr.txt insert end "\n" Normal 
       .fr.txt tag bind lk$lkcount <1> [list eval exec [auto_execok start] "$inln"] 
       incr lkcount 
      } 
      "<image>" { 
       gets $infile inln 
       .fr.txt insert end "\n" 
       set meh [image create photo -file [file join "Files/$inln"]] 
       .fr.txt insert end " " center 
       .fr.txt image create end -image $meh 
       .fr.txt insert end "\n" 
      } 
      "<test>" { 
       gets $infile inln 
       callTuto $inln 
      } 
      "<results>" { 
       gets $infile inln 
       DisplayResults 
      } 
      "<entry>" { 
       gets $infile inln 
       DispEntry 
      } 
      "<adv>" { 
       gets $infile inln 
       Advice 
      } 

      "<proc>" { 
       gets $infile inln 
       $inln 
      } 
      default { 
       set txln "$inln\n" 
       .fr.txt insert end $txln Normal 
      }   
     }  
    } 

    .fr.txt configure -state disabled 
    close $infile 
} 

Кто-то может помочь мне найти решение или ошибки?

ответ

0

Основная проблема в вашем коде лежит на этих линиях:

button .fr.bar.bk -text "<< Back" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [expr $::i - 1]]} 
button .fr.bar.nx -text "Next >>" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [expr $::i + 1]]} 

Проблема заключается в том, что вы не изменить значение, сохраненное в переменной ::i. Простое изменение будет использовать incr команды здесь:

button .fr.bar.bk -text "<< Back" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [incr ::i -1]]} 
button .fr.bar.nx -text "Next >>" -pady 5 -borderwidth 0 -command { dispFile [lindex $::data [incr ::i]]} 

Однако, я был бы склонен к фактору, что из немногих, чтобы иметь маленькие вспомогательные процедуры, которые понятны в их целях :

proc nextFile {} { 
    global data i 
    incr i 
    dispFile [lindex $data $i] 
    # Ought to check for what happens at the end; turn off Next button if no next file 
} 
proc backFile {} { 
    global data i 
    incr i -1 
    dispFile [lindex $data $i] 
    # Ought to check for what happens at the start; turn off Prev button if no previous file 
} 
button .fr.bar.bk -text "<< Back" -pady 5 -borderwidth 0 -command backFile 
button .fr.bar.nx -text "Next >>" -pady 5 -borderwidth 0 -command nextFile 

Факторинг, как это делает сложное поведение много легче писать.

+0

Эта работа, чтобы изменить файл, но в текстовом фрейме есть что-то странное: первое содержимое файла остается, а часть следующего файла добавляется после первого. – PiXieBulles

+0

'.fr.txt insert end' прикрепляет текст до конца. Ваша процедура dispFile должна сначала удалить весь текст. –

0

По @Donal Fellows, я использовал свой код для «назад» и «рядом» кнопки и я улучшил его и мою процедуру «dispFile»:

proc dispFile {name} { 
    set flname "[pwd]/Files/$name" 
    set infile [open $flname "r"] 
    set inEOF -1 
    set txln "" 
    set lkcount 0 
    set counter 0 

    grid forget .fr.canv 
    .fr.vscroll configure -orient vertical -command {.fr.txt yview} 
    grid .fr.txt -column 0 -row 1 -sticky snwe 
    .fr.txt configure -state normal 
    .fr.txt delete 1.0 end 

    while {[gets $infile inln] != $inEOF} { 
     switch $inln { 
      "<Title>" { 
       gets $infile inln 
       .fr.titl configure -text $inln 
      } 
      "<subTitle>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitle 
      } 
      "<subTitlec>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitlec 
      } 
      "<subTitlecu>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" subTitlecu 
      } 
      "<Titlec>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlec 
      } 
      "<Titlecu>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlecu 
      } 
      "<Highlight>" { 
       gets $infile inln 
       .fr.txt insert end "$inln\n" Titlecu 
      } 
      "<hyperlink>" { 
       gets $infile inln 
       .fr.txt insert end "$inln" "link lk$lkcount" 
       .fr.txt insert end "\n" Normal 
       gets $infile inln 
       .fr.txt tag bind lk$lkcount <1> "openPDF Files/$inln" 
       incr lkcount 
      } 
      "<hypLink>" { 
       gets $infile inln 
       .fr.txt insert end "$inln" "link lk$lkcount" 
       .fr.txt insert end "\n" Normal 
       .fr.txt tag bind lk$lkcount <1> [list eval exec [auto_execok start] "$inln"] 
       incr lkcount 
      } 
      "<image>" { 
       gets $infile inln 
       .fr.txt insert end "\n" 
       set meh [image create photo -file [file join "Files/$inln"]] 
       .fr.txt insert end " " center 
       .fr.txt image create end -image $meh 
       .fr.txt insert end "\n" 
      } 
      "<test>" { 
       gets $infile inln 
       callTuto $inln 
      } 
      "<results>" { 
       gets $infile inln 
       DisplayResults 
      } 
      "<entry>" { 
       gets $infile inln 
       DispEntry 
      } 
      "<adv>" { 
       gets $infile inln 
       Advice 
      } 

      "<proc>" { 
       gets $infile inln 
       $inln 
      } 
      default { 
       set txln "$inln\n" 
       .fr.txt insert end $txln Normal 
      }   
     }  
    } 

    .fr.txt configure -state disabled 
    close $infile 
} 

proc nextFile {} { 
    global data i 
    incr i 
    if {$i== [llength $data]} { 
    set i 0 
    } 
    dispFile [lindex $data $i] 
} 

proc backFile {} { 
    global data i 
    incr i -1 
    if {$i <= 0} { 
    set i 0 
    } 
    dispFile [lindex $data $i] 
} 
proc loadBackground {} { 
    #variables 
    set ::i 0 
    set close 0 
    set bgColour "White" 
    set fd [open [pwd]/content/background r] 
    set ::data [split [read $fd] \n] 
    close $fd 

    #window definition 
    toplevel .fr 
    wm title .fr "Background" 
    wm geometry .fr 660x550+0+105 
    .fr configure -bg $bgColour 

    # define the main text zone 
    text .fr.txt -wrap word -yscroll {.fr.vscroll set} -highlightthickness 0 
    scrollbar .fr.vscroll -orient vertical -command {.fr.txt yview} 
    grid .fr.txt -column 0 -row 1 -sticky snwe 
    grid .fr.vscroll -column 1 -row 1 -sticky snwe 

    # define the canvas for interactive diagrams 
    canvas .fr.canv -bg #f8f8f8 -yscrollcommand {.fr.vscroll set} -scrollregion "0 0 750 750" 

    .fr.txt tag configure center -justify center 
    .fr.txt configure -font "times 12" -state disabled 

    .fr.vscroll configure -orient vertical -command {.fr.txt yview} 
    grid .fr.txt -column 0 -row 1 -sticky snwe 
    .fr.txt configure -state normal 
    .fr.txt delete 1.0 end 

    # title of section 
    label .fr.titl 
    .fr.titl configure -font "arial 20" -pady 10 
    grid .fr.titl -column 0 -row 0 -sticky swe 
    .fr.titl configure -background "White" 

    #text styles 
    .fr.txt tag configure Normal -font "times 12" 
    .fr.txt tag configure subTitle -font "times 14" 
    .fr.txt tag configure Titlec -font "times 16" -justify "center" 
    .fr.txt tag configure subTitlec -font "times 14" -justify "center" 
    .fr.txt tag configure subTitlecu -font "times 14" -justify "center" -underline on 
    .fr.txt tag configure Titlecu -font "times 16" -justify "center" -underline on 
    .fr.txt tag configure Title -font "times 16" 
    .fr.txt tag configure link -foreground blue -font "times 12" 
    .fr.txt tag configure right -foreground "forest green" 
    .fr.txt tag configure wrong -foreground red 
    .fr.txt tag configure enhance -background "light goldenrod" 
    .fr.txt tag configure rightenhance -background "light goldenrod" -foreground "forest green" 
    .fr.txt tag bind link <Enter> ".fr.txt configure -cursor hand1" 
    .fr.txt tag bind link <Leave> ".fr.txt configure -cursor arrow" 

    dispFile [lindex $::data $::i] 

    #buttons definition 
    frame .fr.bar 
    grid .fr.bar -row 2 
    button .fr.bar.bk -text "<< Back" -pady 5 -borderwidth 0 -command backFile 
    pack .fr.bar.bk -padx 5 -pady 5 -side left -fill none 
    button .fr.bar.cl -text "Close" -pady 5 -borderwidth 0 -command { set close 1} 
    pack .fr.bar.cl -padx 5 -pady 5 -side left -fill none 
    button .fr.bar.nx -text "Next >>" -pady 5 -borderwidth 0 -command nextFile 
    pack .fr.bar.nx -padx 5 -pady 5 -side right -fill none 

    vwait close 
    destroy .fr 
} 
Смежные вопросы