Как дооснастить GUI для существующей программы на C? - PullRequest
12 голосов
/ 22 декабря 2008

Я работал над проектом переноса старой CL-программы Solaris для работы в Linux и устранения некоторых не связанных с этим проблем с оборудованием. Теперь я хочу графический интерфейс для него, чтобы пользователь мог выбирать среди различных опций с раскрывающимися списками и флажками, а также некоторые области ввода текста для опций, которые не так ограничены, как имя файла. (Программа является внутренним инструментом для запуска некоторых спектросканеров и сохранения результатов в виде CSV-файлов. Она обрабатывает все эти параметры, запускает сканеры, обрабатывает информацию и сохраняет ее с указанным именем файла; я просто хочу использовать что-то более приятное, чем CL. )

Единственный раз, когда я видел что-то подобное, был PyGTK + GUI с привязками python для кода C (я думаю, что так оно и было; это был мой первый совместный семестр, и я не очень понимал! ). Это немного больше, чем я хочу получить прямо сейчас; Есть ли относительно простой способ сделать это? Когда я погуглил, я обнаружил, что SWIG (http://www.swig.org/index.php); - это хороший путь?

Ответы [ 11 ]

17 голосов
/ 22 декабря 2008

Это звучит как работа, для которой Tcl / Tk была разработана. Он имеет очень простой C API, который позволяет регистрировать команды с помощью обратного вызова. Если вы используете команду в программе Tcl, она вызовет функцию обратного вызова и предоставит механизм для преобразования аргументов между списком Tcl (структура собственных данных) и массивом стиля ARGV типа char *.

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

  • Регистрация команд в Tcl Переводчик
  • Вставьте Tcl-интерпретатор в ваш запрограммировать и использовать Tcl в качестве встроенного язык сценариев (возможно, включая регистрацию команд и обратные вызовы на ваш программа)
  • Создать процесс с дуплексным каналом и отправлять команды через стандартный / стандартный вывод (вы также можете прикрепить обработчик события в канал, который вызывается при наличии данных)
  • Меньше Tcl специфических механизмов, таких как fork / exec или подключение через сокеты.

Книга Оустерхаута Tcl и TK Toolkit немного устарели, но содержат хорошее руководство по C API. Практическое программирование Уэлча в Tcl / Tk - другая классическая книга по Tcl / Tk, которая обновляется чаще. Есть также несколько других книг и довольно много электронных ресурсов в Интернете. Вот некоторые хорошие отправные точки: Учебное пособие по Tcl , Учебное пособие по TK , Сайт поддержки Tcl (возможно, стоит попробовать, чтобы помочь вам решить, хотите ли вы идти по этому маршруту ), Tcl / Tk Wiki и, конечно, Stackoverflow .

TK предоставит вам простой графический интерфейс и его очень легко научить программировать - если немного упрощенно. Это не так уродливо, как раньше , если вы потратите некоторое время на настройку внешнего вида или воспользуетесь движком тем, например Tile.

Как отмечает Норман Рэмси (+1) , другая альтернатива с простым C API - это Lua. Оба имеют свои преимущества и недостатки. Основными преимуществами Tcl являются простой и четко интегрированный инструментарий TK и хорошая, зрелая поддержка из сторонних библиотек (например, Tix ). Основным преимуществом Lua является то, что язык намного приятнее, но нет стандартного инструментария GUI, поэтому пользовательский интерфейс не так хорошо интегрирован. Lua также имеет гораздо лучшую поддержку потоков в интерпретаторе, разработанную для этого с нуля. Однако, если вы оборачиваете устаревшее приложение C / unix, это вряд ли будет важной функцией.

WXWidgets значительно сложнее, чем TK и несет больше времени выполнения багажа, но имеет более богатый набор функций.

Если у вас есть реальная причина полагать, что ваш сценарий превратится в более масштабное приложение, вы можете рассмотреть Lua. Тем не менее, в более широком масштабе вы находитесь в крупном проекте разработки, и Python или Ruby начинают становиться жизнеспособными вариантами. По мере того, как проект становится больше, кодовая база C станет меньшей частью всего проекта, а поддержка сторонних библиотек станет более важным фактором.

Если вы пойдете с Tcl и обнаружите, что ваш проект получает свою собственную жизнь, рассмотрите возможность встраивания интерпретатора Tcl и повторного приведения приложения в качестве API-интерфейса плагина, в который люди могут подключать свои собственные сценарии. Дополнительные функции могут быть выполнены в виде сценариев и, возможно, предоставлены сторонним организациям для обслуживания. Одним из преимуществ системы со встроенным языком сценариев является то, что вам лично не обязательно реализовывать функции. Люди могут написать свои собственные расширения на языке сценариев или заставить третьих лиц сделать это за них.

SWIG предназначен для создания оболочек вокруг библиотек. Он анализирует заголовочные файлы и создает слой клея, который представляет собственный API на целевом языке. Чтобы использовать его, вам нужно будет повторно преобразовать вашу программу в библиотеку.

4 голосов
/ 22 декабря 2008

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

Другой вариант, который я бы рассмотрел, это wxlua . Причины в том, что Lua - это язык, который вы будете не перерастать . Вы также можете предпочесть wxlua, потому что он основан на wxwidgets , который даст вам графический интерфейс . У оригинального Tk был довольно странный и очень не родной внешний вид, но сейчас все намного лучше, поэтому эта причина может не принести особой силы. Вы можете просмотреть два инструментария GUI, чтобы увидеть, что привлекает. Последняя причина, по которой вы можете предпочесть Lua, заключается в том, что проще предоставлять пользовательские типы данных для графического интерфейса и сценариев.

Я бы не стал рассматривать альтернативы, такие как Python и Gtk +, потому что из всех существующих альтернатив только Tcl и Lua с самого начала были разработаны так, чтобы быть женатыми на программах на C .

Вы также спрашиваете о SWIG . Хотя это внешне привлекательно, я рекомендую избегать этого. И Tcl, и Lua имеют очень простых C API , и вы узнаете больше, поймете лучше и будете лучше контролировать свое приложение, если вы научитесь использовать нативный API самостоятельно вместо того, чтобы иметь SWIG генерирует код для вас.

3 голосов
/ 22 декабря 2008

Я должен второй Tcl / Tk. Я сделал то же самое для старых программ, написанных на Fortran / C / C ++. Поскольку писать DSL в Tcl / Tk очень тривиально, в итоге я просто добавил опцию для программы для вывода DSL (по сути, команд Tcl, написанных в procs) для программы tk в eval. Я сделал это для программы, которая выполняет довольно сложные графические анимации на холсте tk, у которых есть возможность сохранить часть анимации в формате MPEG примерно за 4 часа. Люди были поражены. Это также полностью портативный. Tcl / Tk имеет простые, но сложные средства управления событиями (которые по-прежнему не имеют аналогов по своей простоте) для написания приложений с графическим интерфейсом. Вы можете использовать простой канал для взаимодействия с унаследованными программами, если он может читать со стандартного ввода и записывать в стандартный вывод.

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

И это около 10 лет назад. С тех пор Tk значительно расширился / улучшился и приобрел естественный внешний вид.

Основным недостатком являлась упаковка стандартных Tcl / Tk-программ, что в значительной степени решено и сейчас.

РЕДАКТИРОВАТЬ: DSL означает «Язык, специфичный для предметной области» Расширения интерпретатора Tcl проявляются как ключевые слова нового языка. Tcl имеет довольно базовый синтаксис, поэтому этот механизм предоставляет достаточно широкие возможности для расширения языка. Хорошим примером приложения, которое делает это с Tcl, является Expect.

3 голосов
/ 22 декабря 2008

Как насчет Tcl / Tk .. много ресурсов .. таких как this

3 голосов
/ 22 декабря 2008

Я использовал tcl / tk, чтобы оборачивать меньшие программы CLI прежде, и это часто хорошо работает с самого начала.

tcl / tk - это язык / пакет сценариев, который будет вызывать и анализировать вывод CLI, поэтому вам не нужно писать новую программу

Tcl / Tk

1 голос
/ 22 декабря 2008

Поскольку вы уже знакомы с PyGTK, почему бы не использовать Gtk + ? В конце концов, PyGTK - это просто привязки вокруг Gtk +, который написан на C.

Его кроссплатформенность тоже. Поэтому, если вы используете GLib , ваше приложение будет работать практически везде.

0 голосов
/ 22 декабря 2008

Не вдаваясь в рекомендации конкретных библиотек или наборов инструментов с графическим интерфейсом, имейте в виду, что большинство графических интерфейсов работают по модели, управляемой событиями.

Это означает, что большую часть времени приложение делает что-то вроде этого:

  1. ожидание события (например, ввод с клавиатуры, истечение таймера и т. Д.)
  2. вызвать некоторую пользовательскую функцию, основанную на этом событии
  3. вернуться к шагу 1.

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

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

0 голосов
/ 22 декабря 2008

Если вам нужен текстовый режим в вашей программе, TxWin - хороший вариант.

Еще один, TVision клон пугала Borland TurboVision.

0 голосов
/ 22 декабря 2008

Вы можете использовать любой набор инструментов, который вам нравится (tcl / tk или любой другой язык сценариев, который вам удобен, который имеет возможность графического интерфейса), но совет сохранить оригинал как программу CLI (которую ваш GUI затем запускает после сбора опций от пользователя) это хорошо. Нет необходимости связываться с C и т. Д.

0 голосов
/ 22 декабря 2008

Я думаю MGUI - это то, с чем вы можете пойти!

MGui (графический интерфейс пользователя MORELLO) - это кроссплатформенный графический интерфейс пользователя, написанный на ANSI C, также обеспечивающий API C ++ через библиотеку фреймов. Он состоит из библиотеки, включающей все типичные объекты графического интерфейса пользователя, такие как меню, кнопки, редактируемые поля, списки и т. Д., И инструмент генерации кода (MGui Designer), который позволяет пользователю создавать и поддерживать макеты окон приложения с помощью мыши.

MGui позволяет создавать приложения для Windows 3.1, Windows 95/98 / NT, Unix X-Window, DOS (Borland, Watcom и DJGPP) без знания графического API хост-системы. Вы можете просто использовать генератор кода MGui Designer для создания макетов окон и написать свой код для взаимодействия с созданными объектами.

Благодаря своим возможностям MGui полезен для всех, кто хочет реализовать мультиплатформенные приложения без необходимости переноса через GUI. Он идеально подходит для использования во встроенных системах на базе DOS как в реальном режиме, так и в DPMI.

Кстати, здесь - очень хороший список библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...