Pull to refresh

Пишем простое Windows-приложение на Tcl/Tk с использованием SQLite

Reading time 3 min
Views 15K
Добрый день уважаемому хабрасообществу! Немного здесь информации об очень приятном и лёгком в использовании языке программирования TCL, а особенно, полезной для тех, кто только начинает с ним знакомство. Попробую внести посильный вклад в исправление столь досадного недоразумения.

Преамбула

Появилось у меня задание в институте: в качестве лабораторной работы написать небольшое приложение, оперирующее определённым количеством структурированных данных. Приложение должно запускаться под Windows, не требуя установки каких-либо интерпретаторов, баз данных, фреймворков и любого дополнительного софта. Структура данных такова, что их удобно хранить в реляционной БД. При более свободном выборе ЯП и отсутствия требования к лёгкому запуску на любом компьютере я по привычке написал бы всё на РНР+MySQL, но здесь пришлось искать другие пути.
Спросив у товарищей, кто как решает данную задачу, обнаружил, что пишут в основном на Delphi/Visual Basic с использованием csv-подобных файлов в качестве хранилища. Мне не хотелось пользоваться громоздкими системами и отказываться от SQL. И пришло озарение: а ведь я почти каждый день на работе использую TCL! После недолгих поисков информации было обнаружено, что он отлично подойдёт для решения нашей задачи.

Превращение TCL-кода в windows executable

TCL — интерпретируемый язык. Но есть средство, позволяющее создать исполняемый файл из tcl-кода: TkWrap. Оно упаковывает интерпретатор и наш исходный код в один файл, обеспечивая таким образом необходимую нам удобную переносимость.
Работать с ним очень просто:
  1. Скачиваем и распаковываем TkWrap
  2. В полученном архиве есть три файла, нас интересует fullwrap.exe, т.к. только он поддерживает работу с SQLite. Запускаем его: fullwrap.exe hello.tcl -o hello.exe
    hello.tcl — заранее подготовленный файл с исходным кодом, hello.exe — имя исполняемого файла, который мы получим на выходе.
  3. Запускаем созданный hello.exe и любуемся результатами проделанной работы.
Конечно, чтобы было чем любоваться, необходимо это что-то сначала написать. Теперь о TCL-коде.

Работаем с SQLite из TCL

SQLite — легковесная встраиваемая реляционная база данных (цитата из Википедии). Это значит, что мы можем легко пользоваться всеми прелестями SQL без необходимости запускать какие-либо серверы баз данных. То, что нужно.
Подробное описание работы с SQLite из TCL можно найти на официальном сайте SQLite. Приведу вольный перевод основных моментов:
Команда sqlite3 dbcmd database-name подключает нас к базе данных database-name (если такой не существует, она будет создана автоматически). dbcmd — выдуманный нами идентификатор соединения. После выполнения этой команды нам становится доступна команда dbcmd с различніми методами (которых всего существует 22). Для примера рассмотрим только самый популярный, eval:
dbcmd eval sql ?array-name ? ?script?
Команда выполняет sql-код sql и, если последние параметры опущены, возвращает результат выполнения. Для прохода же по строкам (при выборке) можно использовать что-то такое:
db1 eval {SELECT * FROM t1 ORDER BY a} values {
parray values
puts ""
}

Для каждой из строк таблицы t1 (конечно, она должна для этого существовать) будет создан ассоциативный массив values, содержащий значения этой строки, и выведен на экран.

Пишем наше приложение

Итак, пример: небольшое приложение на Tcl/Tk, позволяющее выполнить произвольный sql-запрос к базе данных ourdb.
proc do_query {} {
upvar query_res query_res
set ret [query [.querytext get 0.0 end]]
set query_res [lindex $ret 1]
if {[lindex $ret 0] !=0} {
.res configure -fg red ;#подсвечиваем красным текст, если база данных вернула ошибку
} {
.res configure -fg black
}
}

proc query {text} { ;# выполняем sql-запрос и возвращаем список, состоящий из кода ошибки (0 при успехе) и текста: результата либо описания ошибки
upvar ourdb ourdb
set errcode [catch {ourdb eval $text} ret]

return [list $errcode $ret]
}
sqlite3 ourdb ourdb;#подключились к базе данных
wm title . "Работаем с SQLite"
label .query -text "Введите запрос к базе данных ourdb:" -compound center
text .querytext -width 100 -height 6
button .execute -text "Выполнить запрос" -command {do_query}

label .restitle -text "Результат:" -compound center
label .res -textvariable query_res -wraplength 200
button .exit -text Выход -command exit
. configure -padx 10 -pady 10 ;# поля для более красивого отображения окна
pack .query .querytext .execute .restitle .res .exit -expand yes ;# отображаем все созданные виджеты

Сохранив этот код и натравив на него описанный выше TkWrapper, получим наше приложение:


Ссылки

Подробнее о TCL можно почитать здесь: http://tmml.sourceforge.net/doc/tcl/
О создании графического интерфейса с помощью Tk: http://linux.yaroslavl.ru/docs/prog/tcltk/tk.html
Tags:
Hubs:
+4
Comments 9
Comments Comments 9

Articles