Пример программы на tcl/tk


Используя любой из известных вам наборов управляющих графических объектов инструментальных средств графической оболочки операционной системы UNIX — написать командный файл – скрипт, реализующий пример оконного интерфейса для выполнения следующего задания.

Задание: стартовать x-term в фоновом режиме и исполнить в нем Х-утилиту xsetroot, предварительно выбрав в диалоговом режиме параметры из списков по номеру строки, содержащей требуемое значение. Каждый из списков формировать с использованием стандартных форм, предусмотренных набором объектов, выбранного вами инструментального средства программирования интерфейса.

список 1: background — цвет
список 2: foreground — цвет
список 3: тип заполнения — 1 (узор 1) — подготовить заранее
список 4: тип заполнения — 2 (узор 2) — подготовить заранее
список 5: такт изменения типа заполнения (подготовить заранее)

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

Интерфейс программы
После запуска программы Вы должны увидеть следующую форму:



Инструкция по работе с программой:
1) Необходимо выбрать два узора из списка (pic1, pic2, pic3, pic4):




Примечание: четный клик — первый узор, нечетный — второй.

2) Ввод цвета foreground и background из стандартного списка цветов:




Примечание: четный клик вводит background, нечетный клик — foreground.
Примечание: список цветов сформулирован из файла rgb.txt.

3) Выбор такта изменения типа заполнения (от 1 до 10 секунд):



4) После выбранных параметров необходимо нажать на кнопку «СТАРТ»

Листинг программы

#!/usr/local/bin/wish –f

#Программа состоит из четырех фреймов (пять, если считать подфрэймы).
frame .frame1
frame .frame1.frame1 # Отображение картинок с узорами (2 label)
frame .frame1.frame2 # Вывод списка с узорами
frame .frame2 # Вывод списка цветов
frame .frame3 # Выводит выбранные цвета, а так же кнопки «СТАРТ» и «ВЫХОД»
frame .frame4 # Выбор такта изменения

# Инициализируем глобальные переменные flag, PicPath1, PicPath2
set flag 0
set PicPath1 pic1
set PicPath2 pic1

# Объявляем объекты, которые принадлежат первому фрейму и подфреймам
image create bitmap pic1 -file [file join pic1]
label .frame1.frame2.lp1 -width 50 -height 50 -image pic1 # Первоначально оба label
label .frame1.frame2.lp2 -width 50 -height 50 -image pic1 # заполнены pic1
label .frame1.frame1.l1 -text "Узоры" -font Tahoma
listbox .frame1.frame1.lb1 -exportselection 1 -selectmode single -yscroll ".frame1.frame1.sb1 set"
scrollbar .frame1.frame1.sb1 -relief sunken -command " .frame1.frame1.lb1 yview"
bind .frame1.frame1.lb1 {ShowPics} # При клике левой кнопки мыши
# меняется lp1 и lp2 (процедура ShowPics).

# Пакуем первый фрейм
pack .frame1.frame1.l1 -side top
pack .frame1.frame1.sb1 .frame1.frame1.lb1 -side left -fill y -expand no
pack .frame1.frame2.lp1 .frame1.frame2.lp2 -side left -expand no

# Объявляем объекты, принадлежащие фрейму 2.
label .frame2.l0 -text "Цвета" -font Tahoma
listbox .frame2.lb1 -exportselection 1 -selectmode single -yscroll " .frame2.sb1 set"
scrollbar .frame2.sb1 -relief sunken -command " .frame2.lb1 yview"
bind .frame2.lb1 {showcolor} # При клике левой кнопки мыши
# меняется цвет .frame3.l1 и .frame3.l2 (процедура showcolor).

# Пакуем второй фрейм
pack .frame2.l0 -side top
pack .frame2.sb1 .frame2.lb1 -side left -expand no -fill y

# Объявляем объекты, принадлежащие фрейму 3.
label .frame3.l0 -text "Ввод BG" -font Tahoma
label .frame3.l1 -relief sunken -text "Цвет BG"
label .frame3.l2 -relief sunken -text "Цвет FG"
button .frame3.b1 -text "СТАРТ" -command {SetRootProc}
button .frame3.b2 -text "ВЫХОД" -command {exit}

# Пакуем третий фрейм.
pack .frame3.l0 .frame3.l1 .frame3.l2 -fill x
pack .frame3.b1 -expand no -pady 10 -padx 10
pack .frame3.b2 -expand no -pady 10 -padx 10

# Объявляем объекты, принадлежащие фрейму 4.
label .frame4.l0 -text "Такт изменения" -font Tahoma
scale .frame4.timeout -width 10 -orient horizontal -from 1 -to 10 -tickinterval 1 -relief raised -fg blue -command {selecttact}

# Пакуем четвертый фреймов.
pack .frame4.l0 .frame4.timeout -fill x -expand no

# Паковка фреймов
pack .frame1.frame1 -fill x -side left -expand no
pack .frame1.frame2 -fill x -side right -expand no
pack .frame1 -side top -fill x -padx 10 -expand no
pack .frame4 -side bottom -expand no -fill x
pack .frame2 -side left -fill y -expand no -padx 10
pack .frame3 -side right -fill y -expand no

# Заполняем листбокс с цветами
set rgb [open rgb.txt r]
while {[eof $rgb] == 0} {
set colorstr [gets $rgb]
if {$colorstr != ""} {
.frame2.lb1 insert 0 $colorstr
}
}
.frame2.lb1 delete 0
close $rgb

# Заполняем листбокс с узорами
set pics [open Pictures r]
while {[eof $pics] == 0} {
set yzor [gets $pics]
if {$yzor != ""} {
.frame1.frame1.lb1 insert 0 $yzor
}
}

close $pics

# Процедура showcolor (меняет цвет .frame3.l1 и .frame3.l2)
proc showcolor {} {
set Pos ""
set temp [.frame2.lb1 curselection]
set bgfg [.frame2.lb1 get $temp]
set flag [.frame3.l0 cget -text]
if { $flag == "Ввод BG" } {
set Pos "BG"
.frame3.l1 configure -bg $bgfg
set bgfg $Pos=$bgfg
.frame3.l1 configure -text $bgfg
.frame3.l0 configure -text "Ввод FG"
} else {
set Pos "FG"
.frame3.l2 configure -bg $bgfg
set bgfg $Pos=$bgfg
.frame3.l2 configure -text $bgfg
.frame3.l0 configure -text "Ввод BG"
}
}

# Процедура ShowPics (меняет узоры в .frame1.frame2.lp1 и .frame1.frame2.lp2)
proc ShowPics { } {
global flag
global PicPath2
global PicPath1
set temp [.frame1.frame1.lb1 curselection]
if { $flag == 0 } {
set PicPath1 [.frame1.frame1.lb1 get $temp]
image create bitmap bitpic1 -file [file join $PicPath1]
.frame1.frame2.lp1 configure -image bitpic1
set flag 1
} else {
set PicPath2 [.frame1.frame1.lb1 get $temp]
image create bitmap bitpic2 -file [file join $PicPath2]
.frame1.frame2.lp2 configure -image bitpic2
set flag 0
}
}

set tact 1 # по умолчанию tact равен 1
# Процедура selecttact (получение значения такта изменения (записывается в tack))
proc selecttact {i} {
global tact
set tact $i
}

# Процедура SetRootProc (Кнопка старт) — запускает xterm и исполняет в нем xsetroot
proc SetRootProc { } {
global tact
global PicPath2
global PicPath1
set bgclr [.frame3.l1 cget -bg]
set fgclr [.frame3.l2 cget -fg]
exec xterm -e xsetroot -bg $bgclr -fg $fgclr -bitmap $PicPath1
after [expr 1000*$tact]
exec xterm -e xsetroot -bg $bgclr -fg $fgclr -bitmap $PicPath2
}


Комментарии запрещены.




Статистика