In article <35721239...@kais.kyoto-u.ac.jp>
sobue <so...@kais.kyoto-u.ac.jp> writes:
Ousterhoutの『Tcl and the Tk Toolkit』の Part IV: Tk's C Interfacesに
まさにそのC言語でのTkの使い方を具体例を使って説明してあります。
御覧になったら如何でしょうか?
--
成松 宏 na...@mxb.meshnet.or.jp http://www2b.meshnet.or.jp/~nari
Hiroshi Narimatsu wrote:
ご紹介の本の邦訳はすでに持っていますが、確かに各関数の機能については詳しく記述
してあるのですが、実際にアプリケーションを作る時にどうやって使ったら良いのかわか
らないので困っているのです。アプリケーションの実例は書いてないようですが。
ひとえに私の勉強不足によるものでしょうが、(初心者なもので)
win = Tk_CreateWindows(interp,NULL,"jikken","jikken")
とかやってもコンパイルできません。
どなたかメインの窓だけを表示するアプリケーションのコードとコンパイル方法を御存知
ないでしょうか。
In article <35754C99...@kais.kyoto-u.ac.jp> ,
sobue <so...@kais.kyoto-u.ac.jp> writes
>ひとえに私の勉強不足によるものでしょうが、(初心者なもので)
僕もその本を読んだのだと記憶しますが、実際のアプリケーションは、
また別にソースを読んで勉強しました。といっても、
Tk_Main(argc, argv, Tcl_AppInit);
とかするだけで、あとはtcl_evalしていくだけですよね。(こうい
うのはCで書くとは言わないと思った記憶がある) 個人的にはpTkが
いいかなとも思うけど... C で書くものでもない気がする。Tk4.1
だと、unix/tkAppInit.c あたりかなぁ。
ちなみに読んだのは、Eclipse Prolog のTk interface。Tcl/Tk は
さすがに、tcl の部分は使う気がしなかった。Tkの前は InterViews
を使っていましたが、オブジェクトが増えると遅くなってしまって...
>win = Tk_CreateWindows(interp,NULL,"jikken","jikken")
>とかやってもコンパイルできません。
コンパイルできないんだったら、エラーメッセージを見れば
いいんですけどね。
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
In article <35754C99...@kais.kyoto-u.ac.jp>
sobue <so...@kais.kyoto-u.ac.jp> writes:
> > > C言語でTkを使いたいのですが、どうやったら良いのか情報を教えて下さい。本
> > > を読んでも具体例がないのでTk_Window などの使い方がわかりません。アプリケ
> > > ーションのcの簡単なソースがあったら良いのですが。(窓を表示するだけと
> > > か)
> >
> > Ousterhoutの『Tcl and the Tk Toolkit』の Part IV: Tk's C Interfacesに
> > まさにそのC言語でのTkの使い方を具体例を使って説明してあります。
> > 御覧になったら如何でしょうか?
> > --
> > 成松 宏 na...@mxb.meshnet.or.jp http://www2b.meshnet.or.jp/~nari
>
> ご紹介の本の邦訳はすでに持っていますが、確かに各関数の機能については詳しく記述
> してあるのですが、実際にアプリケーションを作る時にどうやって使ったら良いのかわか
sobueさんのおっしゃる『C言語でTkを使う』という意味を誤解していたよう
です。すみません。『C言語でTkを使う』やりかたとしては次の2つを思い付
きます。
1. C言語でTkの新たなwidgetを作り、既存のtcl/tkと一緒に使う
2. C言語で書いたプログラムにtcl/tkのインタプリタを組み込み、tcl/tk
のプログラムを使用できるようにする。
わたしは、1ばかりやっていたもので、sobueさんもそうであろうと思って
答えてしまいました。 2の方法であれば、次のようなプログラムでできます。
======================= sample.c ============================
#include <tk.h>
main()
{
Tcl_Interp *interp;
interp = Tcl_CreateInterp();
if (Tcl_Init(interp) == TCL_ERROR) exit(1);
if (Tk_Init(interp) == TCL_ERROR) exit(1);
Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
Tcl_Eval(interp,"button .exit -text exit -command exit;pack .exit");
Tk_MainLoop();
Tcl_DeleteInterp(interp);
Tcl_Exit(0);
}
======================= sample.c (ここまで) ================
コンパイル&リンクの方法は、私の環境では、次のようになります。
% cc sample.c -I/usr/X11R6/include -I/usr/local/include -L/usr/X11R6/lib\
-L/usr/local/lib -ltk42 -ltcl76 -lX11 -lm
tcl/tkのバージョンが変わると、多少修正が必要になるかもしれません。
tkに添付の tkAppInit.cとtkMain.cを参考にすると、いいと思います。
sobueさんの『C言語でTkを使う』方法が、これでもなければ教えて下さい。
祖父江信太郎 so...@kais.kyoto-u.ac.jp
>> いろいろとありがとうございました。ライブラリとのリンク等を少し変更したらコンパイルで
>> きました。またこれを元に少しいじってみようと思います。Tcl/Tkでファイルマネージャを友
>> 人と共に作ってみたのですが、実行速度とスクリプトが煩雑になってしまう問題で、Cで書き
>> 直してみようと試みています。MacやWindowsと比較してXではGUIプログラムを作るための
>> 環境と情報が不足している様に思えますがいかがでしょうか。
以下の `The GUI Toolkit, Framework Page' が参考になると思います。
http://www.geocities.com/SiliconValley/Vista/7184/guitool.html
C++ なんですが個人的には Qt がお勧めです。KDE で採用している toolkit で
す。
--
--
# SHIMIZU Tomoharu Mitsubishi Research Institute, Inc.
便乗質問ですが失礼致します。
na...@mxb.meshnet.or.jpさん(06月04日13時):
nari>>======================= sample.c ============================
nari>>#include <tk.h>
nari>>
nari>>main()
nari>>{
nari>> Tcl_Interp *interp;
nari>> interp = Tcl_CreateInterp();
nari>> if (Tcl_Init(interp) == TCL_ERROR) exit(1);
nari>> if (Tk_Init(interp) == TCL_ERROR) exit(1);
nari>> Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
nari>> Tcl_Eval(interp,"button .exit -text exit -command exit;pack .exit");
nari>> Tk_MainLoop();
nari>> Tcl_DeleteInterp(interp);
nari>> Tcl_Exit(0);
nari>>}
nari>>======================= sample.c (ここまで) ================
これはTcl8.0/Tk8.0までなら正常に動作しますが、
Tcl8.1/Tk8.1だとcoreを吐いて死んでしまいます。
この症状は僕だけなのでしょう?
他の方はどうでしょう?
;; 今までどうやっても無理だったのであきらめていたのですが、、、
----------------------------------------------
Name Takaaki Tateishi
E-Mail tt...@jaist.ac.jp
tate...@pluto.dti.ne.jp
URL http://www.pluto.dti.ne.jp/~tateishi/
Org School of Information Science
Japan Advanced Institute of Science and Technology (JAIST)
In article <6lgv6n$kn6$1...@jaist-news.jaist.ac.jp> tt...@jaist.ac.jp writes:
> 立石@JAISTです。
>
> 便乗質問ですが失礼致します。
>
> na...@mxb.meshnet.or.jpさん(06月04日13時):
> nari>>======================= sample.c ============================
> nari>>#include <tk.h>
> nari>>
> nari>>main()
> nari>>{
> nari>> Tcl_Interp *interp;
> nari>> interp = Tcl_CreateInterp();
> nari>> if (Tcl_Init(interp) == TCL_ERROR) exit(1);
> nari>> if (Tk_Init(interp) == TCL_ERROR) exit(1);
> nari>> Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
> nari>> Tcl_Eval(interp,"button .exit -text exit -command exit;pack .exit");
> nari>> Tk_MainLoop();
> nari>> Tcl_DeleteInterp(interp);
> nari>> Tcl_Exit(0);
> nari>>}
> nari>>======================= sample.c (ここまで) ================
>
> これはTcl8.0/Tk8.0までなら正常に動作しますが、
> Tcl8.1/Tk8.1だとcoreを吐いて死んでしまいます。
> この症状は僕だけなのでしょう?
> 他の方はどうでしょう?
Tcl8.1/Tk8.1を持って来てためしたところ、こちらでも Bus Errorになりまし
た。デバッガでみると Tcl_Evalの内部、Tcl_Parseと言うところで落ちている
みたいなので、試しに gccに -fwritable-stringオプションをつけると正常に
動作するようになりました。
man Tcl_Evalを見ると 引数の説明に、must be in writable memory とあります。
=========================== ここから ==================================
char *script (in) ||
Points to first byte |
of script to execute. |
This script must be in |
writable memory: tem- |
porary modifications |
are made to it during |
parsing. |
=========================== ここまで ==================================
いつのまにか、ここが変更になったのだと思います。
na...@mxb.meshnet.or.jpさん(06月09日15時):
nari>>成松@ハンブルソフトです。
nari>>> これはTcl8.0/Tk8.0までなら正常に動作しますが、
nari>>> Tcl8.1/Tk8.1だとcoreを吐いて死んでしまいます。
nari>>> この症状は僕だけなのでしょう?
nari>>> 他の方はどうでしょう?
nari>>
nari>>Tcl8.1/Tk8.1を持って来てためしたところ、こちらでも Bus Errorになりまし
nari>>た。デバッガでみると Tcl_Evalの内部、Tcl_Parseと言うところで落ちている
nari>>みたいなので、試しに gccに -fwritable-stringオプションをつけると正常に
nari>>動作するようになりました。
nari>>
nari>>man Tcl_Evalを見ると 引数の説明に、must be in writable memory とあります。
書いてありました。(^^;
お手数おかけして申し訳ありません。
Tcl_Evalの第2引数にリテラルではなく変数を
渡した場合も正常に動作しますね。
でも、-fwritable-stringを使う方が楽かな、、、
ありがとうございました。
井口@富士通です。
Tcl_Eval の第2引数は writable memory でなければならない
ので以下のように直す必要があります。
ソフトバンクから出ている 『Tcl & Tkツールキット』でも
そうしないと“コアダンプが起こる”よと書かれています。
#かく言う私もはまりました (^_^;)
======================= sample.c ============================
#include <tk.h>
main()
{
char buf[256];
Tcl_Interp *interp;
interp = Tcl_CreateInterp();
if (Tcl_Init(interp) == TCL_ERROR) exit(1);
if (Tk_Init(interp) == TCL_ERROR) exit(1);
Tcl_StaticPackage(interp, "Tk", Tk_Init, (Tcl_PackageInitProc *) NULL);
strcpy(buf, "button .exit -text exit -command exit;pack .exit");
Tcl_Eval(interp, buf);
Tk_MainLoop();
Tcl_DeleteInterp(interp);
Tcl_Exit(0);
}
======================= sample.c (ここまで) ================
<6lgv6n$kn6$1...@jaist-news.jaist.ac.jp>の記事において
tt...@jaist.ac.jpさんは書きました。
> これはTcl8.0/Tk8.0までなら正常に動作しますが、
> Tcl8.1/Tk8.1だとcoreを吐いて死んでしまいます。
> この症状は僕だけなのでしょう?
> 他の方はどうでしょう?
--------------------------------------------------------------------
[井口 克己 ] 富士通 川崎工場 CAD本部 CAD開発統括部 第一CAD開発部
[IGUCHI Katsumi] Email: i...@fd.cad.fujitsu.co.jp Nifty-ID: GDG03031