ui.tcl
download
# Jeden z projektów z laboratorium z programowania na drugim semestrze
# stanowiło mało ambitne zadanie utworzenia Klasy kontenerowej w C++
# opartej na wzorcach z pewnymi zadanymi regułami ;-)
#
# Do celów prezentacji utworzyłem graficzny interfejs użytkownika
# oparty na Tcl/Tk. Ponieważ na serwerze na którym pracowaliśmy nie
# było bibliotek *.h dla Tcl/Tk opracowałem komunikację pomiędzy
# programem w C++ a graficznym interfejsem poprzez potok nazwany
# (nazwa w zmiennej TMP_FILE). Komunikacja operała się na protokole
# tekstowym typu pytanie/odpowiedź.
#
# Nie mogło to już podnieść mi oceny projektu, ale poznałem wtedy
# lepiej managery ułożenia zaimplementowane w Tk, co przydało się
# później w projekcie z administracji systemem UNIX, gdzie należało
# utworzyć w Perl+Tk interfejs do zarządznia użytkownikami i grupami.
#!/usr/bin/wish
# aplikajca do testowania PairSet
set TMP_FILE a.tmp
set LOG_FILE pair.log
# numer aktualnej zmiennej
set varNumber 0
# typ dla danej zmiennej
# typeOfA typeOfB
# wybranie zmiennej
# name - pod jaka zmienna przypisac numer ?
proc var_choose {w name} {
set w $w
tk_optionMenu $w $name A B C D E F
pack $w -side left
}
# wybranie zmiennej
# name - pod jaka zmienna przypisac nazwe ?
proc typ_choose {w name} {
tk_optionMenu $w $name\
PairSet PairSetSorted PairSetParityDigits PairSetEqDigits\
PairSet5 PairSet6
pack $w -side left
}
proc lbl_print {w text} {
label $w -text $text
pack $w -side left
}
proc edit_print {w} {
entry $w -width 5
pack $w -side left
}
proc edit2_print {w} {
entry $w -width 12
pack $w -side left
}
proc btn_cmd {w txt cmd} {
button $w -relief flat -text $txt -command $cmd
pack $w -side left
}
proc btn_show_var {w var} {
button $w -relief groove -text $var -command "model show $var"
pack $w -side left
}
proc model args {
global tmp_file log prog
.d.output configure -text $args
puts $prog $args
flush $prog
puts $log $args
after 300 {
gets $tmp_file tmp
.d.output configure -text $tmp
puts $log $tmp
}
}
# gora
frame .u
pack .u -side top -fill x -expand false
# dol
frame .d -relief ridge -borderwidth 2
pack .d -side top -fill both -expand true
# operacje - metody klas
frame .u.ops -relief ridg -borderwidth 2
pack .u.ops -side left -expand true -fill x
#----------------------------------------------------------------------
set w .u.ops.konstr
frame $w
pack $w -fill x
var_choose $w.a1 ret1
btn_cmd $w.b1 {= new} {model new $ret1 $typ1}
typ_choose $w.tc1 typ1
lbl_print $w.l2 {();}
#----------------------------------------------------------------------
set w .u.ops.sum
frame $w
pack $w -fill x
var_choose $w.ret ret2
lbl_print $w.l1 {=}
var_choose $w.self self2
btn_cmd $w.b1 {.operator+(} {model + $ret2 $self2 $op2}
var_choose $w.op2 op2
lbl_print $w.l2 {);}
#----------------------------------------------------------------------
set w .u.ops.isec
frame $w
pack $w -fill x
var_choose $w.ret ret3
lbl_print $w.l1 {=}
var_choose $w.self self3
btn_cmd $w.b1 {.operator&(} {model & $ret3 $self3 $op3}
var_choose $w.op2 op3
lbl_print $w.l2 {);}
#----------------------------------------------------------------------
set w .u.ops.setter
frame $w
pack $w -fill x
var_choose $w.self self4
btn_cmd $w.b1 {.operator=(} {model = $self4 $op4}
var_choose $w.op2 op4
lbl_print $w.l2 {);}
#----------------------------------------------------------------------
set w .u.ops.idx
frame $w
pack $w -fill x
var_choose $w.self self5
btn_cmd $w.b1 {.operator[](} "model {idx} \$self5 \[$w.idx get\]"
edit_print $w.idx
lbl_print $w.l2 {);}
#----------------------------------------------------------------------
set w .u.ops.bool
frame $w
pack $w -fill x
var_choose $w.self self6
btn_cmd $w.b1 {.operator bool()} {model bool $self6}
#----------------------------------------------------------------------
set w .u.ops.size
frame $w
pack $w -fill x
var_choose $w.self self7
btn_cmd $w.b1 {.operator*();} {model * $self7}
#----------------------------------------------------------------------
set w .u.ops.clear
frame $w
pack $w -fill x
var_choose $w.self self8
btn_cmd $w.b1 {.clear();} {model clear $self8}
#----------------------------------------------------------------------
set w .u.ops.add
frame $w
pack $w -fill x
var_choose $w.self self9
btn_cmd $w.b1 {.operator+=} "model += \$self9 \[$w.a get\] \[$w.b get\]"
lbl_print $w.l1 {(Pair(}
edit_print $w.a
lbl_print $w.l2 {,}
edit_print $w.b
lbl_print $w.l3 {)}
#----------------------------------------------------------------------
set w .u.ops.load
frame $w
pack $w -fill x
var_choose $w.self self10
btn_cmd $w.b1 {wczytaj z pliku:} "model load \$self10 \[$w.name get\]"
edit2_print $w.name
#----------------------------------------------------------------------
set w .u.ops.save
frame $w
pack $w -fill x
var_choose $w.self self11
btn_cmd $w.b1 {zapisz do pliku:} "model save \$self11 \[$w.name get\]"
edit2_print $w.name
#----------------------------------------------------------------------
set w .u.ops.show
frame $w
pack $w -fill x
lbl_print $w.l3 {pokaż: }
foreach i {A B C D E F} {
btn_show_var $w.window$i $i
}
#----------------------------------------------------------------------
# komendy np. Exit
frame .u.cmds -relief ridge -borderwidth 2
pack .u.cmds -side left -expand false -anchor ne -fill y
button .u.cmds.exit -text {Wyjście} -command {exit}
pack .u.cmds.exit
# wyjsciowy tekst
label .d.output -text {EMPTY} -justify right -background white -anchor nw\
-height 4
pack .d.output -fill both -expand true
# exec mknod $TMP_FILE p
# set prog [open "|./exe $TMP_FILE" w]
# set tmp_file [open $TMP_FILE]
# set log [open $LOG_FILE w]
# exec rm $TMP_FILE
(...)
Nie ma bowiem łatwych odpowiedzi.
Nie istnieje nic takiego jak najlepsze
rozwiązanie - zarówno jeśli chodzi o
narzędzia,
jak i języki czy systemy operacyjne. Są
jedynie systemy, które mogą być bardziej
odpowiednie w konkretnych okolicznościach.
I tu właśnie do gry wchodzi pragmatyzm.
Nie należy przywiązywać się do żadnej
określonej metody, ale mieć na tyle rozległą
wiedzę i doświadczenie, by w danej sytuacji
wybrać dobre rozwiązanie.
(...)
Andrew Hunt, David Thomas
"Pragmatyczny Programista"