Tcl/Tk. Разработка графического пользовательского интерфейса для утилит командной строки

    Тестируя облачный токен на различных платформах, меня не покидала мысль о некой несправедливости: почему утилиты конфигурирования токенов PKCS#11 на платформе MS Windows имеют графический интерфейс, а для других платформ его нет. И в первую очередь это касается базовой утилиты p11conf, которая доступна для свободного использования и является утилитой командной строки, взаимодействие с которой осуществляется через стандартный ввод/вывод.

    tkBuilder – графический конструктор


    Выходом могло бы быть написание на языке C/C++ GUI для утилиты p11conf, например, с использованием библиотеки Qt. Но тут в памяти всплыло, что есть скриптовый язык высокого яровня Tcl (Tool Command Language), который в связке с графической библиотекой Tk (Tool Kit) и позволяет быстро создавать графические интерфейсы для консольных программ или утилит командной строки. Впервые я познакомился с пакетом Tk/Tcl в далеком 1997 году, когда планировалось на нем написать графический интерфейс для системы контроля доступа (СКД). Тогда графические возможности пакета произвели сильное впечатление и, в частности, tetris:

    image

    Одной из причин, по которой отказались от использования Tk/Tcl, было отсутствие для него в то время конструктора (дизайнера) аналогичного сегодняшнему, скажем, QT-designer. Освежив в памяти возможности Tk/Tcl, а нас интересовало, помимо графических возможностей, организация взаимодействия с утилитами командной строки, и убедившись, что мы стоим на правильном пути, мы принялись за поиск конструктора. После проведенного анализа имеющихся конструкторов выбор пал на дизайнер tkBuilder_for_tcl8.4:

    image

    Дальнейшая разработка показала правильность выбора. Конструктор оказался не только с понятным интерфейсом, но обладает отличными функциональными возможностями. Он позволяет в ходе разработки отслеживать проект не только целиком:

    image

    но также контролировать его отдельные части:

    image

    Разработчик всегда может посмотреть код всего проекта или его части:

    image

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

    image

    Когда проект завершен, то необходимо его сохранить в итоговом tcl файле:

    image

    О ложках дегтя


    Казалось бы все, бери и запускай утилиту. Но без ложки (на самом деле двух ложек) дегтя нельзя. Первая ложка связана с формированием у виджетов (в нашем случае у виджета text) команд xScrollCommand и yScrollComand., а именно:

    text .fr1.fr2_list -background #ffffff \
       -yscrollcommand [list .fr1.ysc set] -xscrollcommand [list .fr1.scx set]
    

    Не хотят они попадать в итоговый файл. В итоге их пришлось прописывать ручками. Ну и вторая ложка дегтя классическая. Дизайнер tkBuilder_for_tcl8.4 отказывается работать с русскими буквами (можеть я чего не доглядел). Подчеркиваю, это касается только дизайнера и не касается Tcl/Tk, для которого русский язык как дом родной. Здесь тоже пришлось поработать ручками:

    #!/bin/sh
    # the next line restarts using wish \
    exec wish8.5 "$0" ${1+"$@"}
    wm title . "GUI P11CONF"
    global p11conf
    global libpkcs11
    set res ""
    set libpkcs11 ""
    set p11conf "/usr/local/bin64/p11conf"
    . configure  -background #18f1d7
    frame .fr1 -background #18f1d7
    grid .fr1 -column 0 -row 0
    button .fr1.b1 -command  {InitTok . .fr1.fr2_list;} -padx 1 -text "Инициализировать" -width 24
    grid .fr1.b1 -column 0 -row 0
    button .fr1.b2 -command {ChangeUserPin . .fr1.fr2_list; } -padx 1 -text "Сменить USER PIN" -width 24
    grid .fr1.b2 -column 0 -row 1
    button .fr1.b6_3 -command {ChangeSOPin . .fr1.fr2_list "SO"; } -padx 1 -text "Сменить SO PIN" -width 24
    grid .fr1.b6_3 -column 0 -row 2
    button .fr1.b7 -command {InfoObj . .fr1.fr2_list "Obj"; } -padx 1 -text "Просмотреть объекты" -width 24
    grid .fr1.b7 -column 0 -row 3
    button .fr1.b8 -command {InfoObj . .fr1.fr2_list "Clear";} -padx 1 -text "Удалить все объекты" -width 24
    grid .fr1.b8 -column 0 -row 4
    button .fr1.b9_6 -command {InfoToken . .fr1.fr2_list; } -padx 1 -text "Информация о токене" -width 24
    grid .fr1.b9_6 -column 0 -row 5
    button .fr1.b0 -command  {InfoMech . .fr1.fr2_list;} -padx 1 -text "Поддерживаемые механизмы" -width 24
    grid .fr1.b0 -column 0 -row 6
    button .fr1.b3_8 -command {ChangeSOPin . .fr1.fr2_list "Deblock"; } -padx 1 -text "Разблоктровать USER PIN" -width 24
    grid .fr1.b3_8 -column 0 -row 7
    button .fr1.b4_9 -command {InfoDump . .fr1.fr2_list; } -padx 1 -text "DUMP всех объектов" -width 24
    grid .fr1.b4_9 -column 0 -row 8
    button .fr1.b5_10 -command {exit} -text "Выход" -width 10

    В итоге мы получили поддержку графического интерфейса для утилиты командной строки p11conf через утилиту GUITKP11Conf.tcl:

    bash-4.3$ ./GUITKP11Conf.tcl
    

    image
    Теперь смело можно работать с токенами PKCS#11, в том числе и с облачным токеном LIBLS11CLOUD, например, просмотреть какие объекты хранятся на нем:

    image
    Файл проекта GUIP11CONF.tkb и утилиту GUIP11CONF.tcl скачать можно здесь. Утилиту p11conf для различных платформ можно скачать здесь. Маленькое замечание. В утилите GUIP11CONF.tcl прописан путь в утилите p11conf (см. выше):

    global p11conf
    …
    set p11conf "/usr/local/bin64/p11conf"

    Скорее всего, вам придется поправить путь к утилите p11conf с учетом вашей конфигурации.

    Лиха беда начало


    В заключение отмечу, что аппетит приходит во время еды и уже есть желание написать аналогичные графические оболочки для таких утилит командной строки как openssl/lirssl (ССЫЛКА ) или утилит NSS (Network Security Services). Как говорится, лиха беда начало.

    P.S. Продолжение здесь.
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну, и что?
    Реклама
    Комментарии 29
    • 0
      Дико извиняюсь, но язык называется Tcl/Tk
      • 0

        Вы правы. Но в контексте этого материала первично было Tk, так на автомате и отложилось "Тэ-ка Ти-си-эль" (я учил французский).

      • 0
        8.4 в 2017 году? Ох и ох. А что не 8.6 и TTk? Он хотя бы выглядит не так убого.

        Нет, я понимаю, что по одёжке встречают, я сам писал графические приложения на Tcl/Tk (лет пять тому назад), но даже тогда в моём распоряжении уже был 8.5…
        • 0

          А с чего вы взяли, что 8.4? Из названия "tkBuilder_for_tcl8.4"?
          Так это вы не правы. На компьютере стоит все что надо. А "tkBuilder_for_tcl8.4" просто указывает путь, где скачать конструктор.

          • 0
          • +3
            В принципе, разобравшись с системой построения GUI в Tk, графический построитель особо не нужен, там в полне всё логично.
            • 0

              Это еще один плюс для Tk.

              • 0
                Красотища какая!
                • +1

                  Если без злой иронии, то спасибо. Как поется "то или еще будет".

                  • +1
                    С иронией, конечно. Но не злой. Всё таки Tk выглядит достаточно аляповато.
                    Дело тут не в том, что вид не современный, а просто не хватает выравниваний, отступов, единообразия.
                    И весь софт, что мне попадался на Tk имеет эти проблемы.
                    Создаётся ощущение недопиленности.
                    • 0

                      Насчет аляповатости, выше уже упоминался ТТК. И если посмотреть новые demos, то это ощущение и аляповатость отойдет. Я думаю просто вам попадался относительно устаревшие проекты, которые могли писаться в ручную, поэтому всегда есть проблемы выравниваний, отступов, единообразия. Именно поэтому в свое время мы отложили Tk. А вот сейчас попробовал cс tkBuilder-ом и вроде получается. А недопиленность не в самом Tk/Tcl, а в средствах проектирования. Спасибо за добрую иронию.

                      • +2
                        И выравнивания и отступы это все есть. Хотя, надо признать, что «голый» Tk выглядит… аскетично (в винде он выглядит как любое другое приложение), но тотже BWidget, вполне себе настраивается. На мой взгляд, по скорости и удобству разработки небольших переносимых графических приложений, мало что может поспорить со связкой tcl/tk (надеюсь поклонники python и Qt меня сейчас не запинают :) ).
                        • 0

                          А что они (поклонники) должны пинать? Это реальность.

                        • +1
                          Если использовать tile, то вы не заметите серьезных отличий от нативных приложений.
                    • +1
                      С позволения автора, вспомнил ещё один подобный продукт — Visual Tcl, проект вполне живой и рабочий (только что проверил). Т.е. если кому нужно для ознакомления с Tcl/Tk, то вполне подойдет http://vtcl.sourceforge.net
                      • 0

                        Спасибо, ссылка работает. Я тоже проверил — рабочий, но надо набить руку!!! Кстати есть для версии 8.6

                        • 0

                          Посмотрите материал про Visual Tcl

                        • 0

                          Я конечно извиняюсь, но это прекрасный пример того, как не надо делать интерфейсы.


                          Наверняка ведь в этом интерфейсе нажимаются все кнопки сразу и нет никакой защиты от дурака.
                          В консоли хоть думать надо перед тем, как жмакнуть что-то, а здесь можно навертеть дел и ничто не остановит.

                          • 0
                            Наверняка ведь в этом интерфейсе нажимаются все кнопки сразу и нет никакой защиты от дурака.

                            Это просто голословное заявление. Кто или что вам мешает скачать утилиту и запустить. Вот тогда бы вы и убедились, что и все кнопки нажать одновременно нельзя, что есть защита от дурака. И здесь надо думать, что зачем нажимаешь и что и зачем вводишь. Более того, чтобы нажать, надо мышко подвигать или на клавиатуре поработать.
                            Ключевое слово в вашем комментарии "Наверное", а это несерьезно.
                            Должно быть так, я скачал и запустил и оказалося….
                            И еще здесь речь идет не об проектировании идеального интерфейса для той или иной задачи, а об инструментарии, с помощью которого можно спроектировать и реализовать.

                          • 0
                            Я просто оставлю это здесь
                            https://lurkmore.to/Tcl
                            • 0

                              Оставляйте. И это тоже.

                              • +1
                                Отчасти вы правы. Старое достаточно дело. Меня как-то миновала участь с Tcl/Tk, хотя на питоне (TKinter кажется?) когда пробовал, но быстро-быстро перелез на wxWindow. Не суть.

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

                                А задачу, которую решает автор, было бы неплохо попытаться поавтоматизировать — просто парсить --help, и пользуясь эвристиками, ну или пошаговыми подсказками запустившего пользователя… сгенерировать гуй для консольной утилиты.

                                Простые параметры показывать галками, составные (у которых должно быть значение) — полями ввода или выбора файла и так далее (вариантов не 100500). Это был бы номер :)
                                • 0

                                  Как не парадоксально, а вы рассказали как работает сама библиотека облачного токена libls11cloud.so (ls11cloud.dll и т.п.). Когда она инициализируется (в терминах PKCS#11 — C_INITIALIZE), то для доступа к облаку токена требуется ввести пароль (не путить с PIN-кодом токена), и вот тут как раз библиотека и генерирует гуй для ввода пароля на основе анализа какие графические средства установлены на компьютере пользователя.
                                  Да, а сделать универсальное средство для консольных утилит — это неплохою

                                  • 0
                                    Да, а сделать универсальное средство для консольных утилит — это неплохо

                                    Полагаю с помощью того же упомянутого Red — несложно.
                                    • +1

                                      Теперь попробуем.

                              • –1
                                В чём смысл использовать этого уродца и язык этот скриптовый маргинальный? Есть же pyqt.
                                • 0
                                  Есть многое на свете, друг Горацио, что и не снилось нашим мудрецам

                                  В. Шекспир, "Гамлет"

                                  • +2
                                    К примеру, динамическое построение интерфейса и работа с оным (генерация формы ввода данных в БД, как вариант) на tcl/tk делается куда как проще и изщьнее нежели на pyqt (хотя не исключаю, что не до конца «расковырял» эту связку).
                                  • +1
                                    Дизайнер tkBuilder_for_tcl8.4 отказывается работать с русскими буквами (можеть я чего не доглядел).

                                    Ларчик открывается просто. Достаточно в файл file.tcl в функции File::WriteTkbFile и File::ReadTkbFile после строки:


                                    fconfigure $fileID -translation binary


                                    вставить следующую строку:
                                    fconfigure $fileID -encoding utf-8


                                    И никаких проблем с «великим, могучим, правдивым и свободным русским языком!» (И.С. Тургенев) больше не будет.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое