12

私は、古い Solaris CL プログラムを Linux で実行するように移植するプロジェクトに取り組んでおり、関連のないハードウェアの問題を除いて、それは終了しました。今は GUI が必要なので、ユーザーはドロップダウンとチェック ボックスを使用してさまざまなオプションを選択できます。また、ファイル名など、それほど制限されていないオプションのテキスト入力領域もいくつかあります。(このプログラムは、いくつかのスペクトロスキャナーを実行し、結果を CSV ファイルとして保存するための内部ツールです。これらすべてのオプションを処理し、スキャナーを実行して情報を処理し、指定されたファイル名で保存します。CL よりも使いやすいものが欲しいだけです。 )

このようなことが行われているのを見たのは、C コード用の Python バインディングを備えた PyGTK+ GUI だけでした (それがそうだったと思います。それが私の最初の学期の共同作業で、あまり理解していませんでした!)。これは、私が今話したいことではありません。これを行う比較的簡単な方法はありますか?Google で調べたところ、SWIG ( http://www.swig.org/index.php ) が見つかりました。これは良い方法ですか?

4

11 に答える 11

17

これはまさにTcl/Tkが設計された仕事のように思えます。コールバックでコマンドを登録できる非常に単純な C API があります。コマンドを Tcl プログラムで使用すると、コールバックが呼び出され、Tcl リスト (ネイティブ データ構造) と char* の ARGV スタイル配列の間で引数を変換するメカニズムが提供されます。

この種のラッパーをコマンドライン駆動の C プログラムに簡単に後付けできるように特別に設計されました。インタープリターとのインターフェースとして使用できるその他のさまざまなモードもあり、スクリプト言語としてプログラムに簡単に組み込むことができます。メモリから、利用可能なインターフェースメカニズムは次のとおりです。

  • コマンドを Tcl インタープリターに登録する
  • Tcl インタープリターをプログラムに組み込み、Tcl を組み込みスクリプト言語として使用します (プログラムへのコマンドとコールバックの登録を含む可能性があります)。
  • 全二重パイプを使用してプロセスを生成し、stdin/stdout を介してコマンドを送信します (データが利用可能になったときに呼び出されるイベント ハンドラーをパイプにアタッチすることもできます)。
  • fork/exec やソケット経由の接続などの Tcl 固有のメカニズムが少ない。

Ousterhout の著書Tcl and the TK Toolkitは少し古いですが、C API の優れたガイドです。Welch のPractical Programming in Tcl/Tkは、もう 1 つの古典的な Tcl/Tk の本で、より頻繁に更新されています。他にもいくつかの本があり、インターネット上には非常に多くの電子リソースがあります。出発点としては、 Tcl チュートリアルTK チュートリアルTcl アドボカシー サイト(このルートに進むかどうかを判断するために熟読する価値があるかもしれません)、Tcl/Tk Wiki、そしてもちろんStackoverflowがあります。

TK は簡単な GUI を提供し、プログラムを習得するのは非常に簡単です。時間をかけて外観を微調整したり、Tile などのテーマ エンジンを使用したりすると、以前ほど見苦しくなくなります

Norman Ramseyが (+1) を指摘しているように、単純な C API を使用した別の代替手段はLua です。 どちらにも長所と短所があります。Tcl の主な強みは、シンプルできれいに統合された TK ツールキットと、サードパーティ ライブラリ ( Tixなど)からの優れた成熟したサポート サポートです。Lua の主な強みは、言語がはるかに優れていることですが、標準の GUI ツールキットがないため、UI がうまく統合されていません。Lua は、インタープリターでのスレッド化のサポートも大幅に向上しており、最初からスレッド化のために設計されています。ただし、従来の C/unix アプリケーションをラップしている場合、これが重要な機能になる可能性はほとんどありません。

WXWidgets は TK よりもかなり複雑で、実行時の負担が大きくなりますが、より豊富な機能セットを備えています。

スクリプト作成プロジェクトがより大きなアプリケーションに成長すると考える真の理由がある場合は、Lua を検討することをお勧めします。しかし、大規模な開発プロジェクトになると、PythonRubyが実行可能な選択肢になり始めます。プロジェクトのラッピングが大きくなるにつれて、C コードベースはプロジェクト全体に占める割合が小さくなり、サードパーティ ライブラリのサポートがより大きな考慮事項になります。

Tcl を使用していて、プロジェクトが独り立ちすることがわかった場合は、Tcl インタープリターを組み込み、ユーザーが独自のスクリプトをフックできるプラグイン API としてアプリケーションを再キャストすることを検討してください。追加の機能はスクリプトとして実行でき、メンテナンスのためにサードパーティに提供される可能性があります。スクリプト言語が組み込まれたシステムの利点の 1 つは、個人的に機能を実装する必要がないことです。スクリプト言語で独自の拡張機能を作成するか、サードパーティに作成を依頼することができます。

SWIG は、ライブラリのラッパーを生成するように設計されています。ヘッダー ファイルを解析し、ネイティブ API をターゲット言語で表示するグルー レイヤーを生成します。それを使用するには、プログラムをライブラリにリファクタリングする必要があります。

于 2008-12-21T23:22:22.423 に答える
5

他の人が言ったように、Tcl/Tk は良い選択です。Tcl 言語を使いこなせなくなるという現実的なリスクがありますが、そのリスクは、Tk ウィンドウ ツールキットの優れた機能とシンプルさによって軽減されます。

私が検討する他の選択肢はwxluaです。その理由は、Luaは成長することのない言語だからですまた、 wxwidgetsに基づいているため、wxlua を好む場合もあります。これにより、GUI のネイティブなルック アンド フィールが得られます。元の Tk はかなり奇妙で非常に非ネイティブなルック アンド フィールを持っていましたが、現在ははるかに改善されているため、この理由はそれほど重要ではありません。2 つの GUI ツールキットに目を通して、何が魅力的かを確認してください。Lua を好む最後の理由は、ユーザー定義のデータ型を GUI やスクリプトに公開する方が簡単だからです。

Python や Gtk+ などの代替手段は考慮しません。すべての代替手段が存在するためです。Tcl と Lua だけが最初から C プログラムと結合するように設計されていました

SWIG についても尋ねます。表面的には魅力的ですが、避けることをお勧めします。Tcl と Lua はどちらも非常に単純な C APIを備えているため、 SWIG にコードを生成させる代わりにネイティブ API を自分で使用する方法を学ぶと、より多くのことを学び、よりよく理解し、アプリケーションをより適切に制御できるようになります。

于 2008-12-22T04:20:24.770 に答える
4

Tcl/Tk を 2 番目にする必要があります。Fortran/C/C++ で記述されたレガシー プログラムに対しても、まったく同じことを行いました。Tcl/Tk で DSL を記述するのは非常に簡単なので、tk プログラムが eval するために DSL (本質的には procs で記述された Tcl コマンド) を出力するプログラムのオプションを追加するだけになりました。私は、アニメーションの一部を mpeg に約 4 時間で保存するオプションがある、tk キャンバスでかなり複雑なグラフ アニメーションを実行するプログラムに対してこれを行いました。人々は驚いた。また、完全にポータブルです。Tcl/Tk には、GUI アプリケーションを作成するためのシンプルでありながら洗練されたイベント ドリブン機能 (そのシンプルさでは比類のないものです) があります。標準入力から読み取り、標準出力に書き込むことができる限り、単純なパイプを使用してレガシー プログラムとやり取りすることができます。

このアプローチの大きな利点は、GUI や追加のライブラリをレガシー プログラムにリンクする必要がないことです。これは場合によっては不可能です。GUI とレガシー プログラムを完全に切り離すことができます。

そしてそれは約10年前のことです。それ以来、Tk は大幅に進化/改善され、ネイティブのルック アンド フィール機能を獲得しました。

主な欠点は、標準のみの Tcl/Tk プログラムをパッケージ化することでしたが、これも現在ではほとんど解決されています。

編集: DSL は「ドメイン固有言語」の略です 。Tcl インタープリターへの拡張機能は、新しい言語キーワードとして自身を明らかにします。Tcl にはかなり基本的な構文があるため、このメカニズムにより、言語を拡張するためのかなりの範囲が可能になります。Tcl でこれを行うアプリケーションの良い例は、Expect です。

于 2008-12-22T04:00:35.450 に答える
3

以前に tcl/tk を使用して小さな CLI プログラムをラップしたことがありますが、最初は問題なく動作することがよくあります。

tcl/tk は、CLI 出力を呼び出して解析するスクリプト言語/パッケージであるため、新しいプログラムを作成する必要はありません。

tcl/tk

于 2008-12-21T23:20:43.440 に答える
3

Tcl/Tk はどうですか .. たくさんのリソース .. このようなもの

于 2008-12-21T23:23:05.060 に答える
1

あなたはすでに PyGTK に精通しているため、Gtk+を使用してみませんか? 結局のところ、PyGTK は C で記述された Gtk+ のバインディングにすぎません。

そのクロスプラットフォームも。したがって、GLibを使用すると、アプリケーションはほとんどどこでも実行されます。

于 2008-12-21T23:20:36.063 に答える
0

特定のライブラリや GUI ツールキットを推奨するのではなく、ほとんどの GUI が「イベント ドリブン」モデルで動作することに注意してください。

これは、ほとんどの場合、アプリケーションが次のようなことを行っていることを意味します。

  1. イベントを待機します (例: キーボード入力、タイマーの期限切れなど)
  2. そのイベントに基づいてユーザー指定の関数を呼び出す
  3. ステップ 1 に戻ります。

呼び出される関数にかなりの時間がかかると、プログラムが応答しなくなります。

これを回避するには、GUI を別のスレッドで処理するか、ユーザーがそれらを中止しようとしたかどうかを確認するために、長寿命の関数を時折譲る機能を使用する必要があります。

于 2008-12-22T16:44:50.433 に答える
0

MGUIはあなたが一緒に行くことができるものだと思います!

MGui (MORELLO Graphic User Interface) は、ANSI C で記述されたクロスプラットフォームのグラフィカル ユーザー インターフェイスであり、フレーム ライブラリを介して C++ API も提供します。これは、メニュー、プッシュ ボタン、編集可能なフィールド、リストなどのすべての典型的な GUI オブジェクトを含むライブラリと、ユーザーがマウスを使用してアプリケーション ウィンドウのレイアウトを作成および維持できるようにするコード生成ツール (MGui Designer) で構成されます。

MGui を使用すると、ホスト システムのグラフィックス API に関する知識がなくても、Windows 3.1、Windows 95/98/NT、Unix X-Window、DOS (Borland、Watcom、および DJGPP) 用のアプリケーションを作成できます。MGui Designer コード ジェネレータを使用してウィンドウ レイアウトを作成し、コードを記述して、作成したオブジェクトと対話することができます。

MGui は、その機能により、マルチ プラットフォーム アプリケーションを実現したいすべての人にとって有用であり、GUI の移植はまったく必要ありません。リアル モードと DPMI の両方で、DOS ベースの組み込みシステムで使用するのに最適です。

ところで、ここにライブラリの非常に優れたリストがあります。

于 2008-12-21T23:24:32.793 に答える
0

好きなツールキット (tcl/tk または GUI 機能を備えた使い慣れたその他のスクリプト言語) を使用できますが、オリジナルを CLI プログラムとして保持することをお勧めします (ユーザーからオプションを収集した後に GUI が実行されます)。 ) いいね。Cバインディングなどに入る必要はありません。

于 2008-12-21T23:27:31.930 に答える
0

プログラムでテキスト モードの UI が必要な場合は、TxWinが適しています。

もう 1 つは、TVision です。Borland TurboVisionのクローンです。

于 2008-12-21T23:30:07.963 に答える
0

コマンドライン実行可能ファイルのラッパーとして機能する UI を要求しているため、任意のツールキットまたはフレームワークで問題を解決できます。C#、MFC、VB6 など、必要なツールを選択できます。C# などの .NET ベースの言語は、コマンド ライン UI ラッパーにとって非常に簡単です。C++ で実行したい場合は、wxWidgets、Qt、または Ultimate++ が役立ちます。

C でプログラミングする方法を知っている場合は、プレーンな Win32 API で行うことができますが、C++ フレームワークで自動的に処理されるいくつかのものを管理する必要があります。

于 2008-12-21T23:23:38.130 に答える