#--------------- # flashCards.tcl # # Interactive language teaching tool. # Created by William J Giddings # 28-October-2007 # #--------------- # Designed to run with gnocl-0.9.91 # http://www.dr-baum.net/gnocl/index.html #--------------- # Notes: # 1) Extensive use is made of variables in the global context, # I know its bad programming but its quick! # 2) gnocl::text widgets have been used to display text, # gnocl::entries could have been used, but this gnocl version # only supports the default font specified in the gnome theme. # 3) The font used to display Hanzi, (chinese text) is SimSun. # In Linux This may need to be copied to the users fonts directory # for the script to work. Alternatively, remove the -fontFamily # option in line 69 to use Linux default font. #--------------- # More Chinese fonts available at: # http://www.sino.uni-heidelberg.de/edv/sinopc/chinese_fonts.htm #--------------- #!/bin/sh # the next line restarts using tclsh \ exec tclsh "$0" "$@" package require Gnocl # set a default pack of cards # to make a new pack simply edit the the values below and resave set ::pack "Lesson 2) Introductions" ;# also functions as window title set ::wordlist { {贵姓 {guìxìng} {May I ask your name?} } {姓 {xìng} {surname } } {来 {lái} {to come} } {介绍 {jièshào} {to introduce} } {一下 {yíxià} {(verbal measure word) time(s) }} {这 {zhè} {this} } {位 {wèi} {polite measure word for people} } {是 {shì} {to be, is, am} } {认识 {rènshi} {to know, to recognize} } {非常 {fēicháng} {very; extremely} } {夫人 {fūrén} {Lady; Madame; Mrs} } {高 {Gāo} {Gao (surname)} } {马 {Mǎ} {Ma (surname)} } {老师 {lǎoshī} {teacher} } {同学 {tóngxué} {classmate; schoolmate} } {院长 {yuànzhǎng} {college/univerisity principal} } {同志 {tóngzhì} {comrade} } } # set index and packsize set ::idx 0 set ::max [llength $wordlist] incr ::max -1 #--------------- # main proc, builds the GUI #--------------- proc main {} { # build main GUI # Step 1) text widgets and containter # 1a) Chinese characters set ::hanzi [gnocl::text -editable 0 -cursorVisible 0] set box(1) [gnocl::box -label Hanzi] $box(1) add $::hanzi -fill {1 1} -expand 1 # make a formatting tag for the text.. $::hanzi tag create txt -fontWeight bold -foreground blue -fontSize 48 -justification center -fontFamily SimSun # 1b) Hanyu Pinyin set ::pinyin [gnocl::text -editable 0 -cursorVisible 0] $::pinyin tag create txt -fontWeight bold -foreground red -fontSize 20 -justification center set box(2) [gnocl::expander -label "Hanyu Pinyin" -child $::pinyin] # 1c) English definitions set ::english [gnocl::text -editable 0 -cursorVisible 0] $::english tag create txt -foreground black -fontSize 16 -justification center set box(3) [gnocl::expander -label English -child $::english] # Step 2) create navigation controls set box(4) [gnocl::box] set first [gnocl::button -text "%#GotoFirst" -onButtonPress first ] set prev [gnocl::button -text "%#GoBack" -onButtonPress prev ] set next [gnocl::button -text "%#GoForward" -onButtonPress next ] set quit [gnocl::button -text "%#Quit" -onButtonPress exit] $box(4) add "$first $prev $next $quit" # Step 3) Create a master container for the above elements set box1 [gnocl::box -orientation vertical -children "$box(1) $box(2) $box(3) $box(4)"] # Step 4) Create a toplevel window and add all widgets in one go set ::main [gnocl::window -height 200 -width 300 -child $box1 -onDestroy exit] # if you have an icon for this window then edit the following line catch { $::main configure -icon "%/./zhong.gif" } # Done, now display first card in the pack eval textUpdate [lindex $::wordlist 0] # and begin the input loop gnocl::mainLoop } #--------------- # perform the task of showing the active item #--------------- proc textUpdate {hz py eng} { foreach {a b} "hanzi \{$hz\} pinyin \{$py\} english \{$eng\}" { # don't you just love it when Tcl lets you do this sort of thing.. :-) eval "[set ::$a] erase \{0 0\} end" eval "[set ::$a] insert end \{$b\} -tags txt" } $::main configure -title "$::pack Card No:[expr ${::idx}+1]" } #--------------- # show first card #--------------- proc first {} { set ::idx 0 eval textUpdate [lindex $::wordlist $::idx ] } #--------------- # show next card #--------------- proc next {} { incr ::idx if { $::idx > $::max} {set ::idx $::max} eval textUpdate [lindex $::wordlist $::idx ] } #--------------- # show previous card #--------------- proc prev {} { incr ::idx -1 if { $::idx < 0} {set ::idx 0} eval textUpdate [lindex $::wordlist $::idx ] } # to run programme.. main