Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C と Tk の使い方について

480 views
Skip to first unread message

sobue

unread,
Jun 1, 1998, 3:00:00 AM6/1/98
to

C言語でTkを使いたいのですが、どうやったら良いのか情報を教えて下さい。本
を読んでも具体例がないのでTk_Window などの使い方がわかりません。アプリケ
ーションのcの簡単なソースがあったら良いのですが。(窓を表示するだけと
か)


Hiroshi Narimatsu

unread,
Jun 2, 1998, 3:00:00 AM6/2/98
to

成松です。

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

sobue

unread,
Jun 3, 1998, 3:00:00 AM6/3/98
to


Hiroshi Narimatsu wrote:

ご紹介の本の邦訳はすでに持っていますが、確かに各関数の機能については詳しく記述
してあるのですが、実際にアプリケーションを作る時にどうやって使ったら良いのかわか
らないので困っているのです。アプリケーションの実例は書いてないようですが。
ひとえに私の勉強不足によるものでしょうが、(初心者なもので)
win = Tk_CreateWindows(interp,NULL,"jikken","jikken")
とかやってもコンパイルできません。
どなたかメインの窓だけを表示するアプリケーションのコードとコンパイル方法を御存知
ないでしょうか。


Shinji Kono

unread,
Jun 3, 1998, 3:00:00 AM6/3/98
to

河野 真治@琉球大情報工学です。

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
河野真治 @ 琉球大学工学部情報工学科

Hiroshi Narimatsu

unread,
Jun 4, 1998, 3:00:00 AM6/4/98
to

成松です。

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を使う』方法が、これでもなければ教えて下さい。

sobue

unread,
Jun 6, 1998, 3:00:00 AM6/6/98
to

いろいろとありがとうございました。ライブラリとのリンク等を少し変更したらコンパイルで
きました。またこれを元に少しいじってみようと思います。Tcl/Tkでファイルマネージャを友
人と共に作ってみたのですが、実行速度とスクリプトが煩雑になってしまう問題で、Cで書き
直してみようと試みています。MacやWindowsと比較してXではGUIプログラムを作るための
環境と情報が不足している様に思えますがいかがでしょうか。

祖父江信太郎 so...@kais.kyoto-u.ac.jp


Shimizu Tomoharu

unread,
Jun 7, 1998, 3:00:00 AM6/7/98
to

>>>>> On Sat, 06 Jun 1998 06:36:54 +0900, sobue <so...@kais.kyoto-u.ac.jp> said:

>> いろいろとありがとうございました。ライブラリとのリンク等を少し変更したらコンパイルで
>> きました。またこれを元に少しいじってみようと思います。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.

tt...@jaist.ac.jp

unread,
Jun 8, 1998, 3:00:00 AM6/8/98
to

立石@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を吐いて死んでしまいます。
この症状は僕だけなのでしょう?
他の方はどうでしょう?

;; 今までどうやっても無理だったのであきらめていたのですが、、、
----------------------------------------------
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)

Hiroshi Narimatsu

unread,
Jun 9, 1998, 3:00:00 AM6/9/98
to

成松@ハンブルソフトです。

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. |
=========================== ここまで ==================================

いつのまにか、ここが変更になったのだと思います。

tt...@jaist.ac.jp

unread,
Jun 9, 1998, 3:00:00 AM6/9/98
to

立石@JAISTです。

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を使う方が楽かな、、、

ありがとうございました。

IGUCHI Katsumi

unread,
Jun 10, 1998, 3:00:00 AM6/10/98
to

井口@富士通です。

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

0 new messages