Newsgroups: fj.lang.tcl,fj.archives.answers
Subject: [comp.lang.tcl] Tk Toolkit Usage Questions And Answers (1/1)
Distribution: fj
Followup-To: fj.lang.tcl
Reply-To: taguchi@aic.co.jp
Expires: Fri Apr 14 00:00:00 JST 1995
Keywords: tk, tcl, expect, extended tcl, wish

Archive-name: tk-usage-QnA-j/part01
Version: 1.4-J1.0

Last modified: Fri Mar 24 12:08:12 1995

Posting-Frequency: monthly

訳者前書き

これは,tja@cpu.com (Thomas J. Accardo) 氏によって管理される "FAQ: comp.lang.tcl Tk Toolkit Usage Questions And Answers" の日本語訳です.オリジナルのヘッダを以下に示します.
  From: tja@cpu.com (Thomas J. Accardo)
  Newsgroups: comp.lang.tcl,comp.answers,news.answers
  Subject: FAQ: comp.lang.tcl Tk Toolkit Usage Questions And Answers (1/1)
  Followup-To: comp.lang.tcl
  Reply-To: tja@cpu.com (Thomas J. Accardo)
  Summary: A regular posting of the comp.lang.tcl Tk Toolkit usage
        questions and answers.
  Originator: tja@cpu.com
  Keywords: tk, tcl, wish
  Sender: tja@cpu.com
  Expires: Sat, 15 Apr 1995 11:59:59 GMT
  Approved: news-answers-request@MIT.EDU

  Archive-name: tcl-faq/tk/part1
  Posting-Frequency: monthly
  Version: 1.5
  Last-modified: March 14, 1995
この日本語訳に対するご意見・ご質問・誤りのご指摘などは,訳者まで. また,その他の詳細な情報については,tcl-faq-j/part00 を参照して下さい.


はじめに

この FAQ ファイルは, Tk ツールキットに関して一般的によく聞かれる質問を扱おうとするものです. 本文書によって,共通的に良く聞かれる質問の回答が提供されることにより, Tk の新規ユーザ諸氏が その入門に当たってのフラストレーションを感じることが低減され, そして,comp.lang.tcl の読者諸氏も同じ質問と回答の繰り返しによるイライラを 感じることがなくなることを期待します.

本FAQは, comp.lang.tclcomp.answersnews.answersに毎月投稿され, また, ftp.aud.alcatel.com (198.64.191.10)のTclアーカイブの, /tcl/docs ディレクトリからも入手可能です.

他の文書やコードへのポインタなどの, さらに多くのTclに関する情報を得られたいならば, Larry Virden (lvirden@cas.org) の管理するFAQ:

    "FAQ: comp.lang.tcl Frequently Asked Questions"
を,ftp.aud.alcatel.comの /tcl/docs/tcl-faq.part0*.gzから入手するとよいでしょう.

Tclプログラミング言語に関する情報は, Joe Moss (joe@morton.rain.com) の管理する FAQ:

    "FAQ: comp.lang.tcl Tcl Language Usage Questions And Answers"
を,ftp.aud.alcatel.comの /tcl/docs/tcl-faq-usage.gzを入手することをお勧めします.

コメントや助言,本FAQへのコントリビューションは,大歓迎です. どうか,tja@cpu.comまでお送り下さい.


質問目次:

I. あなたのシステム上での,Tcl と,その眷族の構築に関する質問:

  • Q1A.私のマシン上で Tcl を動かすために必要な詳細な情報は, どこで得られるのでしょう?
  • Q1B. インストールしようとする時, リンク段階で幾つかのTclの関数が,必要なものが無いよ, と言うのは何故?
  • Q1C. HP-UX で Tcl のコンパイルに成功した人はいませんか?
  • Q1D. SCO Unix で Tcl をコンパイルするには, どうしたらいいんですか?
  • Q1E. tclTest を走らせると, format や scan でエラーになるのは何故?(NeXT, AIX, などで)
  • Q1F. tclTest を Irix 4.0.1 で走らせると, 大量のエラーが出るのは何故ですか?
  • Q1G. Cray で Tcl を問題無く走らせた人はいませんか?
  • Q1H. SparcBook や, その他の色数に限界のあるラップトップ機で Tkを走らせる方法を知ってる人はいませんか?
  • Q1I. Tcl/Tk を,386BSD/Linux や, 他のまだサポートされてないPOSIX/ANSI C システムでコンパイルするには, どうしたら良いのでしょう?
  • Q1J. Irix のマシンで Tk をコンパイルしようとしたら, tkInit.c でパージング・エラーになったのですが?
  • Q1K. NeXTSTEP 3.1 に Tcl 7.x/Tk 3.x を インストールするには,どうしたらいいんですか?
  • Q1L. Tcl/Tk 本のドラフトを印刷できないんですけど?
  • Q1M. なんで SGI Indigoだとエラーになるのでしょうか?
  • Q1N. TclX/Tk に BLT を追加する方法は?
  • Q1O. Sequent に Tcl と Tk を移植するには?
  • Q1P. wish を起動した時に, "正しくないコマンド名だ" と言われるのは何故?
  • Q1Q. A/UX で,シンボルテーブルが一杯だよ, というメッセージは,どうやって回避するの?
  • Q1R. SunOS システム上で動かした xmkmf が Makefile を生成してくれないのは,何故?
  • II. Tk の質問と回答 - 〜するにはどうするの?:

    A. Tk アプリケーションの起動に関する質問
  • Q2.A.1. wish アプリケーションを 実行するには(wish のプロンプトが出るだけなんですけど)?
  • Q2.A.2. 8 ビットカラー以下の マシンで動かすには?
  • Q2.A.3. app-defaultsファイルに wish アプリケーションのリソースを設定するには?
  • Q2.A.4. ファイル名指定じゃなく, ビットマップ・パターンを直接コマンドライン上で 定義できませんか?
  • Q2.A.5. Motifユーザインタフェースを 提供するには?
  • Q2.A.6. OpenLookユーザインタフェースを 提供するには?
  • Q2.A.7. Tk 3.3 をちゃんと起動するには (セキュリティのエラーが出るのですけど).
  • Q2.A.8. C プログラムから Tk スクリプトを呼び出すには?
  • B. Tk アプリケーションとキーボードに関する質問
  • Q2.B.1. デフォルトのクラスバインドを 変更するには?
  • Q2.B.2. バインドを削除するには?
  • Q2.B.3. Sunのキーボードの 矢印キーを使うには?
  • Q2.B.4. Tk アプリケーションで ルートのマウスバインドが動くようにするには?
  • Q2.B.5. 既に存在しているバインドに, 新しいアクションを追加するには?
  • C. Tk と X11 とのインタラクションに関する質問
  • Q2.C.1. アプリケーションで libXt も使いたいんですが?
  • Q2.C.2. X11 のカーソルを変更するには?
  • Q2.C.3. ウィンドウの重なりを上下するには?
  • Q2.C.4. 描画済のウィンドウのIDで 再マップするには?
  • Q2.C.5. 非 Tk の X11 アプリケーションで, Tk でサブウィンドウを使うには?
  • Q2.C.6. 他のウィジェットを含むフレームで, <Enter> と <Leave>をバインドするには?
  • Q2.C.7. Xt と Tk/Tcl 間で 混合インタラクションするには?
  • Q2.C.8. ResizeRequest イベントを バインドするには?
  • Q2.C.9. エラーメッセージ 'bad geometry "+0+0": expected widthxheight' を 回避するには?
  • Q2.C.10. 他のアプリケーションからの"send"を 無視するには.
  • Q2.C.11. `wm'と`winfo'の違いは何ですか?
  • D. Tk のリストボックスに関する質問
  • Q2.D.1. listboxをリサイズするには?
  • Q2.D.2. 同時に,2つの隣り合わない項目を 選択するには?
  • Q2.D.3. 同時に,1 つ以上の項目を 選択するには?
  • Q2.D.4. リサイズ可能なリストボックスの 下端の僅かな空白を消し去るには?
  • Q2.D.5. 一つのスクロールバーで 2つのリストボックスをスクロールさせるには?
  • Q2.D.6. リストボックスを,同時に1つの要素のみ 選択可能とするには?
  • E. Tk のキャンバスに関する質問
  • Q2.E.1. キャンバスから出力を得るには?
  • Q2.E.2. ポリゴンや楕円の様な形に, キャンバス中の幾つかの線分で囲まれた領域を塗りつぶせますか?
  • Q2.E.3. キャンバス中のオブジェクトの重なりを 上下したり,キャンバス中のウィンドウオブジェクトの上に 図形を描いたり出来ますか?
  • Q2.E.4. キャンバスのサイズ変更を 検出するには?
  • Q2.E.5. キャンバスとリストボックスを, 同時に 1 つのスクロールバーでスクロールさせるには?
  • Q2.E.6. 変数に格納された座標情報のリストを, ポリゴン(や,その他のアイテム)の生成に使用するには?
  • F. その他の質問
  • Q2.F.1. 実行しているインタプリタの 名前を知るには?
  • Q2.F.2. テキストウィジェットで -relief を動作させるには?
  • Q2.F.3. ボタンでスクロールできる ウィンドウを作るには?
  • Q2.F.4. テキストウィジェットを 会話的にリサイズ出来るようにpackするには?
  • Q2.F.5. 大文字の名前を持つウィジェットを 作るには?
  • Q2.F.6. 等しいサイズのボタンを作るには?
  • Q2.F.7. フォントによらず, 縦にきれいに並ぶラジオボタンを作るには?
  • Q2.F.8. ある文字列でエントリウィジェットを 初期化してしまうには?
  • Q2.F.9. Tkで,デフォルトの表示色を 変えるには?
  • Q2.F.10. packコマンドで使う際に, 非表示状態のウィンドウを見つけるには?
  • Q2.F.11. '.'以外の全てのウィンドウを 破壊するには?
  • Q2.F.12. ラジオボタンの集まりを 一緒にグループ化するには?
  • 質問目次の終り


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1A- 私のマシン上で Tcl を動かすために必要な詳細な情報は, どこで得られるのでしょう?

    A1A. よくぞ聞いてくれました! Tcl の配布物の中から "porting.notes" と呼ばれるファイルを探して見ましょう. これには,これまで多くの人々から寄せられた, 様々なマシンや OS 上で Tcl を動かす際の注釈事項がまとめられています. また,コードに触ったりする前に最初に読むべき, "README" というファイルもあります (これは,どんなパッケージにも言えることですけど). 最後に, これまでのリリースでの変更点をまとめた "changes" というファイルもあります. これは,あなたのプログラムが修正しなければならない点を知ることができます.
    [訳注]
    Tcl7.3/Tk3.6のporting.notesファイルは更新されています.もし,配付 中のporting.notesに求める注釈が見付からない場合は,tcl7.4b2/tk4.0b2 のファイル,porting.oldを参照すると何らかの情報を得られる場合が あります.訳者は自分のFreeBSD2.0RにTclを載せる際に,それを参照しました.
    →目次へ


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1B- インストールしようとする時,リンク段階で幾つかの Tcl の関数が,必要なものが無いよ,と言うのは何故?

    A1B. "csh ./configure" とかやって, 最初に "configure" プログラムを走らせましたか? これを行わないと,場合によっては, strtoul や strerror 等の記述が失われてしまうことがあります.

    Tcl は,システムにその機能がないならば, 自身で用意した以下の関数とインクルードファイルを用います.

    dirent.h       limits.h       stdlib.h       string.h
    
    opendir.c      strerror.c     strstr.c       strtol.c       strtoul.c
    
    strtod.c
    
    →目次へ


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1C- HP-UX で Tcl のコンパイルに成功した人はいませんか?

    A1C. ポーティング ノートを参照して下さい. また,Configure が互換バージョンの opendir() を (コンパイルに)使うべきだと判断してしまうけど, dirent.hが存在していないという問題の報告が幾つかなされています. これは,glob でエラーを引き起こします.TclX の readdir でも同様です.

    tcl 7.3 では,opendir の互換ファイルを削除する変更を行いましょう. そして,-DNO_DIRENT, -DUSE_DIRENT2 を削除すれば,問題は解決します.

    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1D- SCO Unix で Tcl をコンパイルするには,どうしたらいいんですか?

    A1D. "#undef select" を tkEvent.c に加え, main.c の 460 行目あたりの TK_EXCEPTION の参照を削除します.

    Tk は,その ウィジェット立体表示のために, 表示枠のカラー確保のための独自の仕組みを使っています. これが Tk を,"Pseudo Color" ディスプレイ・クラスで, 16 セルのカラーマップのマシン上で実行する際,問題となります.

    8 bit プレーンを使えないならば, ディスプレイ・クラスを "StaticColor"にする様に, サーバを "-static" (Xsco) や "-analog" (Xsight) オプション指定で立ち上げるとよいでしょう. これは,カラーマップを完全に読み込みのみとし, 要求された色にできるだけ最も近い色を返すようにします.

    この情報は,Keith Amann (Keith_Amann@stortek.com) から寄せられました.

    →目次へ


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1E- tclTest を走らせると,format や scan でエラーになるのは何故? (NeXT, AIX, などで)

    A1E. この (scanf/printf の) 問題は,多くのシステムで見られます. これに関しては,あまり神経質になる必要はありません --- 'より高度な'機能が使えないだけです. もし,あなたが C のハッカーならば,同じ問題に出喰わす筈です.

    実例をあげるならば,printf("%Ng", double_value)と strtod("+",&terminal) は,誤った結果をもたらします.

    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1F- tclTest を Irix 4.0.1 で走らせると,大量のエラーが出るのは何故ですか?

    A1F. これは,4.0.1 のオプティマイザのバグで,4.0.2 では修正されています. tclVar.c を オプション -O0 (最適化無し) でコンパイルして下さい.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1G- Cray で Tcl を問題無く走らせた人はいませんか?

    A1G. ポーティング・ノートの変更点に関する記述を参照して下さい. また,Booker C. Bense (benseb@grumpy.sdsc.edu) は, バージョン 3.0.1.6 ではキャラクタ型のポインタの深刻な問題があり, Tcl がクラッシュすると報告しています. バージョン 3.0.2.1 を使うと多少はマシですが, format コマンドの些細なバグと,scan コマンドの深刻な問題は残ります.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1H- SparcBook や,その他の色数に限界のあるラップトップ機で Tkを走らせる方法を知ってる人はいませんか?

    A1H. SparcBook で, openwin (OpenWindows サーバの起動コマンド) を実行しているならば, 以下のオプションを指定して起動するようにして下さい.
      openwin -dev "/dev/fb staticvis"
    
    こうすれば,静的カラー表示モデルとなり,Tk は,デフォルトよりも良く動作します. 多少,表示が美しくありませんが,モノクロよりは良いでしょう.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1I- Tcl/Tk を,386BSD/Linux や,他のまだサポートされてないPOSIX/ANSI C システムで Tcl をコンパイルするには,どうしたら良いのでしょう?

    A1I. 386BSD へのパッチが, 1992 年 11 月に comp.lang.tcl や alt.sources に投稿されています. これらのアーカイブを保存している ftp サイトを見付けて下さい. 基本的には,幾つかの define の設定と, const char * が使われるべき幾つかの char * を修正するだけです.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1J- Irix のマシンで Tk をコンパイルしようとしたら,tkInit.c でパージング・エラーになったのですが?

    A1J. Jon Knight (J.P.Knight@loughborough.ac.uk) は, 彼の使っているIrixのバージョンでは, uid_t が定義されていないと報告しています. 従って,コンパイルが通るように適当な場所で適当な様に, これを定義してやる (か,問題のあった行をコメントアウトする) 必要があります.
    →目次へ

    From: -K- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1K- NeXTSTEP 3.1 に Tcl 7.1/Tk 3.4 をインストールするには,ど うしたらいいんですか?

    A1K. この議論の種となると思える問題の解として, オーソリティと思える人からの投稿を掲示しましょう.

    From: Robert Nicholson (robert@steffi.demon.co.uk)

    これは TCL7.1 と TK3.4 を対象とします.

    これは Thomas Funke のエントリです. TCL7.1 の NeXT へのインストール法

    tcl7.1 を NeXTSTEP 3.1 にインストールするには,以下のようにします:

    configure を既定義の CPP で実行:
    ボーンシェルを実行するために,"sh" と打ち込みます. そして,以下のようにタイプします.
    CPP='cc -E' ./configure
    Makefile を編集:
    tmpnam.o を COMPAT_OBJS に追加:
    COMPAT_OBJS =      getcwd.o waitpid.o strtod.o tmpnam.o
    この時,NeXT ライブラリ libsys_a.a で供給されるものに対して, strtod と tmpnam を区別するために,何か適当な名前に変更したいと思うでしょう. これを行うためには,AC_FLAGS に,以下の行を付け加えることで出来ます.
            -Dstrtod=newstrtod -Dtmpnam=newtmpnam
    
    名称変更された関数の定義は,compat/*.c にあります.

    全てが正しく動くかどうかをチェックするには,tclsh を起動し, 以下を実行します.

      % expr {"0" == "+"} 
      0
    
    間違えた strtod 関数を用いていたならば,返り値は 1 になり, 深刻なエラーとなります.正確なエラーは無視します. TK3.4 の NEXTSTEP 3.1 へのインストール法

    Tk3.4 の中にも strtod 関数の呼び出しがあるので, 前述の ../tcl-7.1/compat/strtod.o にリンクを張り, AC_FLAGS に -Dstrtod=newstrtod を付け加える必要があります.

    注意: Tk の raise 試験は, ウィンドウマネージャに tvtwm を使っていると失敗します. この試験を通すためには,twm や fvwm などに変更する必要があります.

    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1L- Tcl/Tk 本のドラフトを印刷できないんですけど?

    A1L. John Ousterhout (ouster@tcl.eng.sun.com) によると:

    私のところに届いてる知らせによると, 多くの人々が,この本の一部の印字出力で問題を抱えているようです.

    古いバージョンの Transcript スプーラ・ソフトウェアには, ページが逆順になった PostScript ファイルの中で, 別の encapsulated PostScript ファイルを扱えないものがあるようです. これらは,ページ構造をごっちゃにする傾向があり, 最初の EPS ファイルのところで,エラーになってしまいます. 第 2 部は,スクリーンダンプを載せるために, 沢山の EPS ファイルが埋め込まれています. もし,このファイルを印字出力できないなら, ページ逆順出力が可能となってるかどうかを見て下さい. もしそうであるならば,利用しているシステムのウィザードに言って, 一時的に不能にしてもらいましょう. これで,出力可能になる筈です. あるいは,あるいは,スプールソフトウェアを経由せずに, 直接プリンタに送る手を考えるのもよいでしょう (例えば,プリンタの継ってるシリアルポートに,直接 cat してしまうとか).

    他にも,次の助言が寄せられています.

    組み込まれた図は,行の区切りに LF ではなく CR を使用しているため, これが問題の原因となる場合があります.これらを LF に変換して見ましょう.

     
       tr '\015' '\012' <  book.p2.ps > fixedbook.p2.ps
    
    そして:

    これは,リジナルの投稿者の問題ではありませんが, 出力紙に A4 を使っ ている国で, Dataproducts LZR1260E の様なプリンタを使用している場合, 印字用紙サイズが縦方向に引き延ばされてしまうことがあります. これは,他の Framemaker で生成されたファイルでも発生します. 疑いもなく PS インタプリタのバグでしょう. 修正には,A4 用紙の大きさを編集してやります. 以下のシェルスクリプトは,これらの問題を両方とも修正します.

      #!/bin/sh
      cat $1 | tr '\015' '\012' | sed '/FMDOCUMENT$/s/612 792/595 842/'
    
    →目次へ


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1M- なんで SGI Indigo だとエラーになるのでしょうか?

    A1M. Gordon Lack (gml4410@ggr.co.uk)によれば, SGI の C コンパイラには,変数引数の扱いにいくつかのエラーがあるそうです.

    tclVar.c は,IRIX C 4.0.1 では,変数に関するバグのため, 引数 -O0 でコンパイルされねばなりません.

    Makefile のルール指定を以下のように書き換えてやります.

     
      > # GGR SG needs -O0 for varargs at 4.0.1
      >
      > CC_SWITCHES0 =  -O0 -I. -I${SRC_DIR} ${AC_FLAGS} ${MATH_FLAGS} \
      > ${GENERIC_FLAGS} ${PROTO_FLAGS} ${MEM_DEBUG_FLAGS} \
      > -DTCL_LIBRARY=\"${TCL_LIBRARY}\"
      >
      > tclVar.o: tclVar.c
      >         $(CC) -c $(CC_SWITCHES0) $<
    
    Peter NEELIN (neelin@pet.mni.mcgill.ca) は, 次のような注意をしてます.

    私は,ファイル Config.mk を次のように変更して, TclX 7.3a を SGI (irix4.0.5) でコンパイルしました.

     
      71c71
      < CFLAGS=-cckr -D__GNU_LIBRARY__
      ---
      > #CFLAGS=
      106,107c106,107
      < TCL_PLUS_BUILD=TCL_PLUS
      < CCPLUS=g++
      ---
      > #TCL_PLUS_BUILD=TCL_PLUS
      > CCPLUS=CC
      191,193c191
      < MAN_DIR_SEPARATOR=
      < 
      < LIBOBJS=strftime.o
      ---
      > #MAN_DIR_SEPARATOR=.
    

    -D__GNU_LIBRARY が,srandom 問題を解決しますが, 思うに,-cckr が waitpid でプロトタイプ・エラーを起こします (汚いですが,とりあえず動きます). strftime がなぜ必要だったかは,忘れてしまいました.

    私の作成した Config.mk のバージョンが欲しいならば,メールして下さい.

    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1N- TclX/Tk に BLT を追加する方法は?

    A1N. George A. Howlett (gah@grenache.mhcnet.att.com)によって, 回答が得られました.

    TclX を blt_wish に追加する代わりに,別の方法でやってみましょう. BLTをwishxに追加するのです.これは,とっても簡単です.

    ファイル ./tksrc/tkXAppInit.c の 116 行目に, 次のような BLT の初期化ルーチンを付け加えます.

     
        if (TkX_Init(interp) == TCL_ERROR) {
            return TCL_ERROR;
        }
        if (Blt_Init(interp) != TCL_OK)) {
            return TCL_ERROR;
        }
    
    そうしてやって,libBLT.a を wishx にリンクすれば,おしまいです.

    他の手段として,tkmkmf や make-a-wish パッケージを使用してもいいでしょう.

    →目次へ


    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1O- Sequent に Tcl と Tk を移植するには?

    A1O. Andrew Swan (aswan@soda.berkeley.edu)によって解明されました.

    Tcl と Tk 双方で,非 ANSI の Sequent cc ではなく,gcc を用います.

    Tcl では,数学ライブラリに,2 つの問題があります. 第1に,Sequent の数学ライブラリが,'fmod' 関数を含んでいないことです. 私は fmod のソースを ftp.uu.net から入手し, サブディレクトリ compat に入れました. そして,それを Makefile に追加しました. fmod は,'isnan' と 'finite'関数を内部で使用していますが, tcl が無限と nan をサポートすると信じなかったので, それらはコメントアウトしただけです.

    数学ライブラリのもう 1 つの問題は, そのライブラリ中に 'tanh' 関数のコピーが 2 つ, 含まれてしまっていることです."ar" を使って ライブラリをオブジェクトに分解し,再度組み立て直して, tanh のコピーを取り去ってしまえば,簡単に fix できます.

    この様な変更を行えば,Tcl のコンパイルはきれいに終了し, 試験も,scanの試験以外はすべて通ります. どうも,Dynix では,*scanf 関数が壊れてる様です. この問題は,8 進数の終りで確認できます. 私は,ちょうど,この問題に取り掛かったところです. 解決策は,*scanf 関数のソースを見付けだし,それを使うことになるでしょう.

    Tk をコンパイルするために, 私は wchar_t のようなものを定義した, 新しいバージョンの stddef.h を作らねばなりませんでした. 私はそれを別のインクルード・ディレクトリにコピーし, そのディレクトリを最初に指定して,それが参照されるようにしました. Tk でも数学ライブラリの問題 (tanh) が発生します. これら以外もありますが,すべてのコンパイルはきれいに終了し, すべての試験にもパスします.

    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1P- wishを起動した時に,「正しくないコマンド名だ」と言われるのは何故?

    A1P. これは,新しいバージョンのwishを構築した時, それを起動しようとするとしばしば発生する問題で, 例えば,次のようなエラーが起きます.
    $ /projects/xopsrc/wishx3.6a            
    Error: invalid command name "tk_bindForTraversal"
    invalid command name "tk_bindForTraversal"
        while executing
    "tk_bindForTraversal Entry"
        (file "/projects/xopsrc/Tclsrc/v7/lib/3.6a/tk.tcl" line 98)
        invoked from within
    "source $tk_library/tk.tcl"
        invoked from within
    "if [file exists $tk_library/tk.tcl] {
                source $tk_library/tk.tcl
            } else {
                set msg "can't find $tk_library/tk.tcl; perhaps you "
                append  ..."
    
    この様なケースでの *本当*の問題は, 正しく config されてないか,きちんとインストールされてないかのどちらかです. コマンド名が本当は正しいならば, 外部変数が指しているディレクトリが, デフォルトのそれを上書きしてしまっているか, インストール時に指定してないかで,auto_pathが正しく設定されていないのでしょう.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1Q- A/UX 3.0 で,シンボルテーブルが一杯だよ,というメッセージは,どうやって回避するの?

    A1Q. AU/X 上でのソースのコンパイルが終ったならば, デフォルトのテーブルのアロケーションを拡張する -A {factor} 引数を リンカに指定しなければなりません. {factor} は,デフォルトのアロケーションの何倍にするかを指定します. -A 2 を試してみましょう. この移植に関するこれ以上の詳細は, Walter B. Kulecz 博士 (wkulecz@medics.jsc.nasa.gov)に 連絡すると良いでしょう.
    →目次へ

    From: -I- あなたのシステム上での,Tcl と,その眷族の構築に関する質問:
    Subject: -Q1R- SunOS システム上で動かした xmkmf が Makefile を生成してくれないのは,何故?

    A1R. 非常に数多くのユーザから, OpenWindows 付属の imake/xmkmf を使おうとした際の問題の報告がなされています. この問題に対処する助けを得るには,comp.sys.sun.* で聞いて見るのがよいでしょう. この問題は,X11R6 のimake規則でも発生を予測する人もいます. すべての既知の imake テンプレート等のバグを修正しても問題は残るでしょう. 調べてみて下さい.
    →目次へ


    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.1- wish アプリケーションを実行するには - wish のプロンプトが出るだけなんですけど? または,permition denied とか,not found とか言うようなエラーが出るだけなんですけど?

    A2.A.1. ほとんどのシステムでは,インタプリタはフルパスで指定する必要があります. 従って,wish スクリプトの冒頭を,次の様に始めてはいけません.
      #! wish -f
    
    その上,多くの Unix システムでは, #! 行に書ける文字列長の最大長さに制限があります. もし制限を越えてしまうと,期待通りの動作はしないでしょう. ですからwish のコードでは,次のようにしてもいけません.
      #! /長いプロジェクト名/何か/長〜い/パス名/bin/sun4/wish -f
    
    行は短めにしておきましょう.32 文字以下を推奨します. kennykb@carla.crd.ge.com (Kevin B. Kenny)は, スクリプトの始めの行を以下のようにする技を推奨しています:
      #!/bin/sh
      # This line makes the next one a comment in Tcl \
      exec /path/to/wish "$0" ${1+"$@"}
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.2- 8 ビットカラー以下のマシンで動かすには?

    A2.A.2. Tk は,8 bit 未満のカラー・スクリーンでは綺麗に動きません. もし,そんな環境で動作させようとするならば,Tk/wish のソースの中の, ビット・プレーンの数を調べるために呼び出されている全ての DefaultDepthOfScreen 関数の記述されている場所を探しだします. そして,1 bit プレーンである振りをするよう書き換えるか, あるいは,Tcl 変数を監視するプロシージャを呼び出すように書き換えます. この方がつぶしが効きますし,好ましいでしょう.

    別の選択しとして,使用しているサーバに,スタティク・カラーのような, 別のビジュアル/カラーモデルが使えないか調べて見る手があります. この様なモデルの 1 つは,Tk をよりよく動かす事が出来るでしょう.

    この情報を提供してくれた Nathaniel Borenstein (nsb@thumper.bellcore.com)に感謝します.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.3- app-defaultsファイルにwishアプリケーションのリソースを設定するには?

    A2.A.3. option コマンドのドキュメントを読みましょう. そうしたならば,次のようにして実現すればよいことが分かる筈です. なお,ここではプログラム名を xwf とします.

    次に示す 2 つの汎用プロシージャを,ライブラリに置きます.

    # envVal envValName
    #   環境変数 envValName を見付けだし,その値を返す.存在しない場合は
    #   {} を返す.
    proc envVal {envValName} {
      global env
      if [info exists env($envValName)] {return $env($envValName)} {return {}}
    }
    
    # loadAppDefaults classNameList ?priority?
    #   指定したクラス名 className に一致する app-defaults ファイルを
    #   X ツールキット・イントリンシクス に指定された順番で探しだし,指定
    #   されたプライオリティ (デフォルトは startupFile) でロードする.
    proc loadAppDefaults {classNameList {priority startupFile}} {
      set filepath "[split [envVal XUSERFILESEARCHPATH] :] \
                    [envVal XAPPLRESDIR] \
                    [split [envVal XFILESEARCHPATH] :] \
                    /usr/lib/X11"
      foreach i $classNameList {
        foreach j $filepath {
          if {[file exists $j/$i]} {
            option readfile $j/$i $priority; break
          }
        }
      }
    }
    
    そうしたならば,例えば,次のように xwf のコード中に記述します.
    option add Tk.BoldFont "*-lucida sans-Bold-R-Normal-*-100-*" widgetDefault
    loadAppDefaults {xwf XWF} userDefault
    
    これは,プログラムのデフォルトをまず設定しています. そして,ユーザのデフォルトのリソース値に指定されたデフォルト値を読み込み, 最後に,サイト毎,あるいは,一般的な app-defaults リソースを読み込みます. 勿論, 実行時にユーザがこれらの値を設定しなおすことが出来るようなプログラムを, xwf に組み込んでやる事も可能でしょう.

    Chris Milam (アドレス不詳) は, 様々な設定元からの app-defaults ファイルをマージする X11R5 の機構をサポートするよう変更した loadAppDefaultsを提供してくれました.

    # loadAppDefaults classNameList ?priority?
    #   Searches for the app-default files corresponding to classNames in
    #   the order specified by X Toolkit Intrinsics (R5), and loads them with
    #   the priority specified (default: startupFile).
    proc loadAppDefaults {classNameList {priority startupFile}} {
      set lang [envVal LANG]
      if {[string length $lang] > 0} { set lang /$lang }
      set filepath "\
                    /usr/lib/X11${lang}/app-defaults \
                    [split [envVal XFILESEARCHPATH] :] \
                    [envVal XAPPLRESDIR]${lang} \
                    [split [envVal XUSERFILESEARCHPATH] :] \
                    "
      foreach i $classNameList {
        foreach j $filepath {
          if {[file exists $j/$i]} {
            option readfile $j/$i $priority;
          }
        }
      }
    }
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.4- ファイル名指定じゃなく,ビットマップ・パターンを直接コマンドライン上で定義できませんか?

    A2.A.4. 1992 年 6 月現在のところ,未拡張の Tk では,これは不可能です. これは,パターンが 16 進の内部コードとして提供されているためです. 外部ファイルを指定するしかありません. 一方,この様な機能を提供している拡張を使う手もあります (BLT は,その 1 つです).
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.5- Motif ユーザインタフェースを提供するには?

    A2.A.5. Tk は,今の所 Xt ツールキットを使っていません. そのため, libXm.aのルーチンによる厳密なMotifへの忠実性を提供する事は出来ません. しかしながら,Tkの作者は, Motifのユーザインタフェースの形式を採用していますので, Tkで,Motiofの様なインタフェースを実装しようとするのは 簡単であることが分かるでしょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.6- OpenLook ユーザインタフェースを提供するには?

    A2.A.6. 残念ながら,Tk は現在の所, Xview ベースや Xt ベースのウィジェットをユーザインタフェースに用いていません. 従って,OpenLook に準拠した(あるいは,似通った)インタフェースを扱う事は, 当面は非常に難しいでしょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.7- Tk 3.3 をちゃんと起動するには - セキュリティのエラーが出るのですけど.

    A2.A.7. 同じ原因に根がある問題として,「Tk 3.3 の send がこけるのですが」とか, 「xauth は,どうやって使うのですか」などといった質問があります.

    Tk 3.3 では,X11 の xauth セキュリティ機構が使われています. これは,より安全な環境を提供してくれますが, ユーザに,通常よりは多い設定を要求します. ユーザは,Xauthority ファイル(通常は $HOME/.Xauthority)を生成しなければならず, また,X サーバを -auth オプションに, 生成した Xauthority ファイルのファイル名を付けて起動する必要があります. xauth や,相当するソフトウェアの使い方,設定ファイルの記述法に関する詳細は, 使用しているシステムの X11 ドキュメントを参照して下さい. xauth の入門の文章は,以下から入手可能です.
    ftp://ftp.aud.alcatel.com/tcl/docs/Xauthority

    ファイル tk3.3/Makefile.in を,以下のようにコメントアウトすることで, Tk を xauth によらず,動作させる事も可能です.

    # To turn off the security checks that disallow incoming sends when
    # the X server appears to be insecure, reverse the comments on the
    # following lines:
    #SECURITY_FLAGS =
    SECURITY_FLAGS = -DTK_NO_SECURITY
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.A.8- C プログラムから Tk スクリプトを呼び出すには?

    A2.A.8. 最近,いくつかの簡単な例題が,comp.lang.tcl に投稿されました. Eric Bleeker (ericbl@paramount.nikhefk.nikhef.nl)は, 慈悲深くも彼のパッケージを以下に公開してくれています.
    ftp://ftp.aud.alcatel.com/tcl/code/tkHelloWorld*

    このプログラムは,既に Tcl や Tk ライブラリ, ヘッダファイルなどがインストール済であることを前提としています.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.B.1- デフォルトのクラスバインドを変更するには?

    A2.B.1. Tk ウィジェットに対する,全てのクラスバインドは, $tk_library/tk.tcl で初期化されます. このファイルを, 独自のバインドをインプリメントする際の参照にすると良いでしょう. 例えば,次のコードは,全てのリストボックスに対して, マウスボタン 1 で提供されるドラッグ-選択機能を, マウスボタン 3 でも提供するようにするものです.
      bind Listbox <3> {%W select from [%W nearest %y]}
      bind Listbox <B3-Motion> {%W select to [%W nearest %y]}
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.B.2- バインドを削除するには?

    A2.B.2. "bind" を, 空文字列のコマンド名を引数に実行します. 例えば,エントリ・ウィジェットでDeleteキーを無効にするには, 以下のようにします.
            bind Entry <Delete> {}
    
    →目次へ


    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.B.3- Sun のキーボードの矢印キーを使うには?

    A2.B.3. それを指定するには,<R10> ではなく, <Left> などとしなければなりません. X11 環境下では,キーは,その keysym で指定されます. ユーザは,xmodmap -pk コマンドか, xev コマンドを使う事で,現在の設定下でキーボード上のキーに割り付けられている keysym の値がどんなものであるかを知る事ができます.

    keysym が,Tk にとって,その使用法が知られていないものであった場合, ファイル ks_names.h を修正する事で,対応させることもできます. この対応法で注意しなければならないことは, 他人は同様の修正をしているわけではない,という点です. しかしながら,これが新しい keysym を受け入れさせる唯一の方法です.

    この注釈を寄せてくれた Wayne Christopher (faustus@CS.Berkeley.EDU) に感謝します.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.B.4- Tkアプリケーションでルートのマウスバインドが動くようにするには?

    A2.B.4. mwm の様ないくつかのウィンドウマネージャでは, Tk で問題となるようなマウスのバインドを定義し得ます. 使用中のウィンドウマネージャの初期化ファイル (例えば ~/.mwmrc など) を保存しておいて, 動いている人のそれをコピーして見ましょう.

    この非常に貴重な情報を寄せてくれた Brad Morrison (brad@NeoSoft.com)に感謝します.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.B.5- 既に存在しているバインドに,新しいアクションを追加するには?

    A2.B.5. 実際に問われた質問は,以下の通り.
    どんなキー入力に対しても,ウィンドウのタイトルバーを更新するように, テキスト・ウィジェットをバインドしようとして,次のように書いて見ました.
            text .textWin ...
            bind .textWin <Any-KeyPress> {+wm title . "Nextedit - edited"}
    
    これは,ウィンドウの中のテキストが編集済であるかどうかを, ユーザに知らせる機能をサポートします. 問題は "+" です.これは,どこに行くんでしょう? 色々な書き方を試して見ましたが,パーズ・エラーに終るか, wm コマンドが完全にバインドを乗っ取ってしまい, テキストに何の入力もできなくなるかになってしまいます. キー入力をテキストに入力させ, *かつ*タイトルバーを更新させるには, 別のバインドを付け加える必要があると思うのですが,どうすればよいのでしょう?
    Gerald W. Lester (gwl@cpu.com)が,答えました:
    クラス指定のバインドを,ウィジェット指定のバインドに降ろす必要があります. こうしてみて下さい.
       bind .textWin <Any-KeyPress> Text
       bind .textWin <Any-KeyPress> {+wm title . "Nextedit - edited"}
    
    →目次へ


    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.1- アプリケーションで libXt も使いたいんですが?

    A2.C.1. Tk2.1 と Xt は,異なった X との接続をしており,XtAppNextEventは, X との接続から (Tk に) 何も行かない様にブロックしてしまいます. これを修正する 1 つの方法は,
       ConnectionNumber(Tk_Display(tk_window));
    
    を使って,Tk の接続ナンバを得て, XtAddInput を使ってこれを Xt のイベントハンドラとして記憶させることです. XtAddInput のコールバック関数は, Tk_OneEvent(1) を実行するプロシージャをラップします. Xt に記憶されていない Tk のファイルを読み込むことは,問題となるかも知れません.

    この情報を寄せてくれたJoe Wang (joe@astro.as.utexas.edu)に 感謝します.

    →目次へ


    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.2- X11 のカーソルを変更するには?

    A2.C.2. M. G. Christenson (mgc@cray.com) が紹介してくれたやり方を, 以下に示します.

    利用可能なカーソル名の一覧を調べるために, /usr/include/X11/cursorfont.h を参照します. カーソル名は,この中の記述から,頭の 'XC_' を取り去ったものです.

    以下に示すのは,私のアプリケーションで, 何か動作中にカーソルの形状を変える 'busy' プロシージャです. 実行したいコマンドを引数にこれを呼ぶだけで,コマンドの実行が完了するまで, カーソルを時計マークに変更してくれます. (これを実行した後に生成される) 新しいウィンドウの中では, カーソルは通常の形状となる点は注意して下さい.

      proc busy {cmds} {
        global errorInfo
    
        set busy {.app .root}
        set list [winfo children .]
        while {$list != ""} {
            set next {}
            foreach w $list {
                set class [winfo class $w]
                set cursor [lindex [$w config -cursor] 4]
                if {[winfo toplevel $w] == $w || $cursor != ""} {
                    lappend busy [list $w $cursor]
                }
                set next [concat $next [winfo children $w]]
            }
            set list $next
        }
    
        foreach w $busy {
            catch {[lindex $w 0] config -cursor watch}
        }
    
        update idletasks
    
        set error [catch {uplevel eval [list $cmds]} result]
        set ei $errorInfo
    
        foreach w $busy {
            catch {[lindex $w 0] config -cursor [lindex $w 1]}
        }
    
        if $error {
            error $result $ei
        } else {
            return $result
        }
      }
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.3- ウィンドウの重なりを上下するには?

    A2.C.3. これは,将来解決すべき (ほとんど無限の) リスト中にある事柄です. もし時間があるならば,これを解決するコードを書いて見て下さい. 非常に歓迎されるでしょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.4- ウィンドウを再マップするには?

    A2.C.4. "wm deiconify <windowid>" を使いましょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.5- 非 Tk の X11 アプリケーションで,Tk でサブウィンドウを使うには?

    A2.C.5. Wayne A. Christopher (faustus@CS.Berkeley.EDU)によれば:
    Tk で,トップレベルウィンドウを生成し, それをマップせずに (wm withdraw) おきます. そうしておいて,他のウィンドウのサブウィンドウになるように, そのウィンドウの親を付け変えてからマップしてやります. Tk アプリケーションが別プロセスであったとき,これを行って見ました. でも,同じプロセスであったならば,各々のツールキットが制御を獲得しようとして, イベントループで問題が起きるでしょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.6- 他のウィジェットを含むフレームで, <Enter>と<Leave>をバインドするには?

    A2.C.6. John Ousterhout (ouster@tcl.eng.sun.com) によれば:
    <Enter> と <leave> イベントは, "%d" を使ってアクセス出来る,「詳細」フィールドを持っています. そのフィールドが "NotifyInferior" であるならば, マウスポインタが子ウィンドウを出入りすることを意味します (実際,イベントを受け取るウィンドウの領域に留まります). スクリプトの中で詳細フィールドをチェックできるようにすべきで, 値が NotifyInferior ならばイベントを無視してやります. 詳細フィールドの完全な情報と Enter/Leave イベントについては, Xlib のドキュメントを参照して下さい.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.7- Xt と Tk/Tcl 間で混合インタラクションするには?

    A2.C.7. [YIP Chi Lap [Beta] (h9118101@hkuxa.hku.hk) によれば]
    Tk と Xt のウィンドウの間で直接インタラクションする (例えば,Xt でディスパッチされたルーチンで Tk のウィンドウを描画するとか) 様なものではありませんが, 両者がとりあえず動作する,重たいイベントループのルーチンを (今まで) 書いてました.
      XEvent xevent;
      for (;;)
      {
        if (XtAppPending(appcontext))
        {
          XtAppNextEvent(appcontext,&xevent);
          XtDispatchEvent(&xevent);
        }
        Tk_DoOneEvent(TK_DONT_WAIT);
      }
    
    [David C Mudie (mudie@radon.eecs.berkeley.edu) によれば]
    私達は,後に示すメインのイベントループを使っています. 基本的なアイディアは,Xt のサーバ・コネクションと Tk のサーバコネクション両方から来るイベントを監視し, (イベントが来たならば) ライブラリのディスパッチャを呼ぶと言うものです.
    次に示すコードの断片は,使用に当たっては, きちんと書き直してやる必要があります. インクルードファイルの指定や,グローバル変数の宣言は欠けています.
    /* Allow Tcl/Tk and Xt to work at the same time. */
    void tkGo(void)
    {
      extern Widget topLevel;
      int width = ulimit(4, -1);
      fd_set readfds;
      struct timeval timeout;
      int nfds;
      int tkfd = ConnectionNumber(Tk_Display(mainWindow));
      int xtfd = ConnectionNumber(XtDisplay(topLevel));
    
      Tcl_VarEval(interp, "update", NULL);
      while (1) {
    
        /* Select on X server connections to wait for event. */
        /* Timeout every half second to allow processing of non-X events */
    
        FD_ZERO(&readfds);
        FD_SET(tkfd, &readfds);
        FD_SET(xtfd, &readfds);
        timeout.tv_sec = 0;
        timeout.tv_usec = 500000;
    
        nfds = select(width, &readfds, NULL, NULL, &timeout);
        if (nfds < 0 && errno != EINTR) {
          perror("select");
        } else if (nfds == 0) {
          /* printf("timeout\n"); */
        }
    
        while (XtPending()) {
          XtProcessEvent(XtIMAll);
        }
    
        while (Tk_DoOneEvent(1)) {
          /* do nothing */
        }
      
        if (mainWindow == NULL) {
    //      Tcl_DeleteInterp(interp);
    //      Tcl_DStringFree(&command);
          Tcl_Eval(interp, "exit");
          return;
        }
      }
    }
    
    [Davide Frisoni (frisoni@faw.uni-ulm.de) によれば]
    異なったアプリケーション間の通信に, Xt のプロパティを用いることも出来るでしょう.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.8- ResizeRequest イベントをバインドするには?

    A2.C.8. Martijn Figee Huffi Marcel Huefken (huffi@dutncp8.tn.tudelft.nl) が言うには:
    :    bind .frame <ResizeRequest> {puts stdout "resise\n"}
    : で,.frame がリサイズできず,標準出力に "resize" も出力されない,
    : という問題を抱えてしまってるのですが.
    
    以下のやりかた
          bind .frame <Configure> {puts...}
    
    を,試して下さい.動くはずです.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.9- エラーメッセージ 'bad geometry "+0+0": expected widthxheight' を回避するには?

    A2.C.9. おそらく,X11 のリソースを, 次に示すような形で指定しているのだと思われます.
            *geometry: +0+0
    
    または,
            Tk*geometry: +0+0
    

    Tk はこの形式を好みません.ですから,これらの指定を削除するか, 次のような形式で完全に指定する必要があります.

            widthxheight{+-}xoffset{+-}yoffset
    
    実例を示すなら,
            Tk*geometry: 200x200+0+0
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.10- 他のアプリケーションからの"send"を無視するには.

    A2.C.10. Tom Poindexter (tpoindex@nyx.cs.du.edu) は,以下のように述べています:
    "send"コマンドを削除してしまいましょう.こうすれば,インタプリタ名を X11プロパティから移動し(他のwishから,"winfo interps"で見れなくする), 他からの"send"処理を受け付けなくなります.sendコマンドの削除は, 次のようにして行えます.
       rename send ""
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.C.11- `wm'と`winfo'の違いは何ですか?

    A2.C.11. fms@cam-orl.co.uk (Frank Stajano) が答えています:
    > wishで以下のように実行すると,ウィンドウが約20ピクセル下に移動しました.
    > %wm geometry . [winfo geometry .]
    > なぜなのでしょう?
    
    "wm geometry"はウィンドウマネージャが考えているジオメトリを返します. (一方,)"winfo geometry"は,Tkの考えてる値を返します.

    このために,"wm geometry"がトップレベル・ウィジェットでしか 動作しないのに対して,"winfo geometry"は,全てのウィジェットで動作するのです. そして,これら双方をトップレベル・ウィジェットに対して使用した場合, "winfo"と異り"wm"は,タイトルバーの領域(この場合は約20ピクセル)も含めて 答えます.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.1- listbox をリサイズするには?

    A2.D.1. 一般的な作法として,wm min/maxsize を使いましょう. 以下に示すのは,サイズ変更可能なリストボックスです.
            #!/usr/local/bin/wish -f
            wm minsize . 20 20
            wm maxsize . 1152 900
            pack append . [listbox .l -borderwidth 2 -relief raised] {expand fill}
    
    テキストウィジェットで,きちんとサイズ変更を管理するにも, 同じ方法が用いられます.

    John C Ellson (ellson@ontap.att.com) に感謝.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.2- 同時に,2 つの隣り合わない項目を選択するには?

    A2.D.2. Tk で,隣り合わないエントリを選択可能に変更する方法は, Marc R. Ewing の Listbox.patch を参照して下さい.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.3- 同時に,1 つ以上の項目を選択するには?

    A2.D.3. Tk のリストボックスのデフォルトでは, その選択物を X のセレクションとして外部に参照可能としています. これは,同時に 1 つしか,行えません.

    Tk の,この仕様を変更するには,リストボックスを生成する時に, -exportselection false を指定してやります. あるいは,コマンド

      option add *Listbox.exportselection false
    
    を,スクリプトの最初に書いてやります.

    この話題を提供してくれた David Herron (david@davids.mmdf.com) に感謝.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.4- リサイズ可能なリストボックスの下端の僅かな空白を消し去るには?

    A2.D.4. まず,問題を明確にして見ましょう. 問題は,リサイズ可能なリストボックスを作りたいが, 最小サイズの設定によって制約を掛けたくない,というものです. それゆえ,リストボックスが上下に広がる (fill expand) 様にパックしてやり, グリッドを設定して (その結果,ウィンドウのリサイズは行単位となります), 1x1 の初期ジオメトリでデフォルトを上書きしてやります. この様に (次のコードを,実例として実行し,リサイズして見て下さい) して,問題を解決しようとしたのですが ....
      listbox .l -geom 1x1 -setgrid 1 -yscrollcommand ".s set" -relief sunken -bd 2
      scrollbar .s -command ".l yview"
      pack .s -side right -fill y
      pack .l -side top -fill both -expand 1
      .l insert end one two three four five six seven eight nine ten "THE END"
    
    リストボックスに,表示仕切れないアイテムが存在する場合には, 底辺に半行のすき間が出来てしまいます. これは,ユーザがそこに何が表示されているのかと混乱させる元になってしまいます. なんで,こうなるのでしょう?

    以下が,その答えです.

    リサイズの前の,ウィンドウが生成されるところを見て見ましょう. 小さなかわいらしいスクロールバーが, 押し縮まって極小のウィンドウに表示されるのがわかるでしょう. これもまた,最小サイズを要求し,そうしてから, リストボックスのジオメトリの指定の, 開始で底辺までの利用できる空間が受け取られます. その結果,リサイズが文字単位に制約されるまでは,無くなりません.

    やることは,実際に表示される行と列数で, ウィジェットの -setgrid 指定を行うことです. 上の例では,-geom 1x2 に設定すると,うまく誤魔化せます.

    この情報を提供してくれた Frank Stajano (fms@cam-orl.co.uk)に感謝.

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.5- 一つのスクロールバーで2つのリストボックスをスクロールさせるには?

    A2.D.5. スクロールバーには, (リストボックスやテキスト,エントリなどの) スクロール可能なウィジェットに対して, スクロールバーが動かされた時に,それらがどの様な(表示)位置に置かれるかを告げる '-command' オプションがあります. このコマンドは,通常は次の形式で使用されます.
         scrollbar .scroll -command {.scrollable_widget yview}
    
    または,
         scrollbar .scroll -command {.scrollable_widget xview}
    

    このコマンドが実行される前に, (指定の内容に対して)空白文字と数値が付加されます. 数値は,スクロール可能ウィジェットが それ自身の位置をどれだけ動かせばよいかを指定する, 論理的な位置インデックスです. 従って,1個のスクロールバーで2つ(またはそれ以上)のウィジェットを制御するには, 単純にスクロールコマンドとしてプロシージャを用い, そのプロシージャで望む通りに複数のウィジェットをスクロールさせてやります. そのプロシージャは,1個の引数(すなわち,論理位置インデックス)を取るでしょう. 例えば,

         proc ScrollCommand {index} {
             .lb1 yview $index
             .lb2 yview $index
             .lb3 yview $index
         }
     
         scrollbar .scroll -command ScrollCommand
     
         listbox .lb1 -geometry 4x5 -yscrollcommand {.scroll set}
         listbox .lb2 -geometry 4x5 -yscrollcommand {.scroll set}
         listbox .lb3 -geometry 4x5 -yscrollcommand {.scroll set}
         pack .scroll .lb1 .lb2 .lb3 -side left -fill y
     
         .lb1 insert 0 a b c d e f g h i j
         .lb2 insert 0 0 1 2 3 4 5 6 7 8 9
         .lb3 insert 0 A B C D E F G H I J
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.D.6- リストボックスを,同時に1つの要素のみ選択可能とするには?

    A2.D.6. tkコマンドの,"tk_listboxSingleSelect"のマニュアル・ページを参照して下さい. これは,次のようにして用います.
      listbox .l
      tk_listboxSingleSelect .l
    
    こうすると, .lのバインディングは同時に1アイテムしか選択できないように変更されます.
    [訳注]
    これはTk4.0に関する記述と思われますが,最終的なTk4.0の仕様を反映した ものかは?です.手元のβ2版によれば,これを行うには以下のようにする ものと思われます.
           .l configure -selectmode single
           

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.1- キャンバスから出力を得るには?

    A2.E.1. 最新の Tk のキャンバスには,その内容を記述したファイルを生成できる, save サブオプションが付いています. デフォルトでは出力は,カプセル化 PostScript ですが, xpm3 で出力することも出来ます.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.2- ポリゴンや楕円の様な形に,キャンバス中の幾つかの線 分で囲まれた領域を塗りつぶせますか?

    A2.E.2. いいえ.何らかの線で囲まれた領域を塗りつぶしたいならば,結局, ポリゴンを使うしかありません.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.3- キャンバス中のオブジェクトの重なりを上下したり,キャンバス中のウィンドウオブジェクトの上に図形を描いたり出来ますか?

    A2.E.3. まだ,不可能です.

    Jesper Blommaskog (d9jesper@dtek.chalmers.se).

    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.4- キャンバスのサイズ変更を検出するには?

    A2.E.4. Nathaniel Pryce (np@hpl.hp.co.uk) によれば:
    < 論理的に埋め尽くすように描画されたオブジェクトのあるキャンバス (謂わ
    < ば,チェス盤や,世界地図みたいなものです) のあるウィンドウを作りまし
    < た.このトップレベルウィンドウをリサイズ可能にしたいのですが,勿論,
    < リサイズした時にはキャンバス内のオブジェクトを,リサイズされた大きさ
    < に従って大きさを変更させてやりたいのです.今のところ,オブジェクトの
    < サイズ変更自体はできますが,その処理をいつ起動するかのタイミングを検
    < 出することが出来ずに困っています.ウィンドウがリサイズされた時のノー
    < ティファイは,どの様に得ればよいのでしょうか?
    
    Nat の答えは:
    コマンドを Configure イベントにバインドする必要があります. 例えば,次のように,すればよいでしょう.
            proc config {w h} {
               puts stdout ".canvas - width = $w, height = $h"
            }
    
            bind .canvas <Configure> "config %w %h"
    
      .canvas - width = 224, height = 251
      .canvas - width = 224, height = 151
      .canvas - width = 224, height = 243
      # and so forth
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.5- キャンバスとリストボックスを,同時に 1 つのスクロールバーでスクロールさせるには?

    A2.E.5. David Herron (david@twg.com) によれば:
    スクロールコマンドのハンドラを書き換えてやる必要があります. `scrollbar' コマンド (と,`listbox' コマンドも) のマン・ページを, まず読みましょう. すると,scrollbar コマンドで実行される様に, 次のようにその scrollcommand に追加すればよいことが分かるでしょう.
            .f.c yview; .f.lb yview <offset>
    
    最後に,私の最終的なものを付け加えておきます. このコードは,スクロールが「右にならえ」である点が優れています.
            listbox .l1     -relief sunken -yscrollcommand {
                            scrollMultiple_y { .l1 .l2 .l3 } .vs
                    }
            listbox .l2     -relief sunken -yscrollcommand {
                            scrollMultiple_y { .l1 .l2 .l3 } .vs
                    }
            listbox .l3     -relief sunken -yscrollcommand {
                            scrollMultiple_y { .l1 .l2 .l3 } .vs
                    }
            scrollbar .vs   -relief sunken -orient vertical \
                            -command {setMultiple_y {.l1 .l2 .l3}}
    
            bind .l1 <1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l1 <B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l1 <Shift-1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l1 <Shift-B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
    
            bind .l2 <1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l2 <B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l2 <Shift-1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l2 <Shift-B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
    
            bind .l3 <1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l3 <B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l3 <Shift-1> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
            bind .l3 <Shift-B1-Motion> {
                    selectMultiple {.l1 .l2 .l3} [%W nearest %y]
            }
    
    proc scrollMultiple_y {lists vs total window first last} {
            if {[expr $first+$window] < $total} {
                    set first [expr $total-$window]
                    set last  [expr $first+$window]
            }
            setMultiple_y $lists $first
            $vs set $total $window $first $last
    }
    proc setMultiple_y  {lists index} {
            foreach l $lists { $l yview $index }
    }
    proc selectMultiple {lists index} {
            foreach l $lists { $l select from $index }
    }
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.E.6- 変数に格納された座標情報のリストを, ポリゴン(や,その他のアイテム)の生成に使用するには?

    A2.E.6. Thomas Accardo (tja@cpu.com) が書いてます:
    これは本当は(Tkレベルではなく)Tclに関する問題なのです. ですが非常によく聞かれる質問ですので解説してみましょう.
    キャンバス・アイテムの全ては,生成時にその初期位置や形状を定義した, 2つかそれ以上の座標情報を必要とします. これらの値をそれぞれ別々の変数に格納していたり,定数を使っているならば, キャンバスのアイテムの生成は単純なものです.例えば:
        .myCanvas create rectangle $x1 $y1 $x2 $y2 -fill blue
        .myCanvas create text 100 250 -text "Hello, world"
    
    ですが,多くの場合には,座標値は個々の変数に格納されてたりはいないものです. それらは,ファイルから読み込んだり,何らかの計算ルーチンからの返値であったり, 他の座標情報のリストから取り出したりした,一つの変数に格納されたリストの 形をとるでしょう.この場合,キャンバスコマンドが実行される前に, 座標情報のリストを分解してやらねばなりません. これには,`eval'コマンドを使ってやります. 以下に幾つかの例題を示しましょう.
         canvas .myCanvas
         pack .myCanvas
    
         #
         # 例題 1
         #
         # 与えられた2座標情報のリストでテキスト・アイテムを生成.
         #
         set coords {150 50}
         eval .myCanvas create text $coords -text hello
    
         #
         # 例題 2
         #
         # 以下に示すプロシージャは,与えられた点を中心点に,指定された
         # 高さと幅の4角形の座標情報を返す.以下の例題で用いる.
         #
         proc CenteredRectangle {centerX centerY width height} {
             return [list [expr $centerX - $width  / 2.0] \
                          [expr $centerY - $height / 2.0] \
                          [expr $centerX + $width  / 2.0] \
                          [expr $centerY + $height / 2.0]]
         }
         eval .myCanvas create rectangle [CenteredRectangle 80 5 10 75]
         eval .myCanvas create rectangle [CenteredRectangle 5 80 75 10]
         eval .myCanvas create oval [CenteredRectangle 140 110 75 50]
    
    
         #
         # 例題 3
         #
         # 以下のルーチンは,指定された点を中心点に,四角形で囲まれたテキスト
         # アイテムを生成する.
         #
         proc CenteredBoxLabel {w centerX centerY text} {
             set id [$w create text $centerX $centerY \
                        -text $text \
                        -anchor center]
             eval $w create rectangle [$w bbox $id]
         }
         CenteredBoxLabel .myCanvas 33 42 "Hello, world"
    
    
         #
         # 例題 4
         #
         # サイン波形を描画
         #
         set coordList {}
         loop x 0 314 {
             lappend coordList $x [expr sin($x/25.0) * 50 + 100]
         }
         eval .myCanvas create line $coordList
    
    [訳注]
    loop文は標準のTcl/Tkには含まれません. ですが,以下のように書けるでしょう.
           set coordList {}
           for {set x 0} {$x < 314} {incr x} {
               lappend coordList $x [expr sin($x/25.0) * 50 + 100]
           }
           eval .myCanvas create line $coordList
    
    例えば {{25 10} {30 12} {35 14}} の様な座標情報の組のリストを使いたい場合には, 平坦なリスト構造に直してやるというステップが必要になります. 以下の例を試してみましょう:
         #
         # 例題 5
         #
         # 2要素リストのリストから始めます ...
         #
         set coordPairs {{25 10} {30 12} {35 14}}
    
         #
         # ... (前述の例題のように)ただの数字のリストの形式に平坦化.
         #
         set flatList [eval concat $coordPairs]
    
         #
         # 後は,これまでの例題と全く同じ.
         #
         eval .myCanvas create line $flatList
    
    まとめましょう. eval,concat,listコマンドのドキュメントを注意深く読めば, 座標情報と`canvas create'コマンドを 実行可能な正しいTclコマンド形式にまとめあげることが出来るようになります.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.1- 実行しているインタプリタの名前を知るには?

    A2.F.1. George A. Howlett (george.howlett@att.com)は, winfo のマニュアルを指摘しています. winfo name . で,現在のアプリケーションの名前を得ることが出来ます.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.2- テキストウィジェットで -relief を動作させるには?

    A2.F.2. Owen Rees (rtor@ansa.co.uk)によれば, 「ボーダーの幅を 0 でなくする必要がある」ということです. これには,次のようにします.
       text .t -width 20 -height 20 -relief sunken -borderwidth 4
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.3- ボタンでスクロールできるウィンドウを作るには?

    A2.F.3. これを行う方法は,少なくとも 2 つ,あります. 1 つは,Tcl ユーザ寄贈コード・アーカイブから得られる, ハイパーテキスト・ウィジェットを使う方法です. 実際にどこから得られるかは,tcl-faq/part4 や tcl-faq/part5 を参照して下さい.

    そして,次に示すコードは,Michael Moore (mdm@stegosaur.cis.ohio-state.edu)から寄せられた, Tkのみでこれを行う方法です.

      #! /bin/wish -f
      #
      # This demonstrates how to create a scrollable canvas with multiple
      # buttons.
      #
      # Author : Michael Moore
      # Date   : November 17, 1992
      #
    
      #
      # This procedure obtains all the items with the tag "active"
      # and prints out their ids.
    
      proc multi_action {} {
        set list [.frame.canvas find withtag "active"]
        puts stdout "Active Item Ids : "
        foreach item $list {
            puts stdout $item
        }
      }
    
      # 
      # This simulates the toggling of a command button...
      # Note that it only works on a color display as is right now
      # but the principle is the same for b&w screens.
      # 
      proc multi_activate {num id} {
        
        set tags [.frame.canvas gettags $id]
        if {[lsearch $tags "active"] != -1} {
            .frame.canvas dtag $id "active"
            .frame.canvas.button$num configure \
                -background "#060" \
                -activebackground "#080" 
        } else {
            .frame.canvas addtag "active" withtag $id
            .frame.canvas.button$num configure \
                -background "#600" \
                -activebackground "#800"
        }
      } 
    
      proc setup {} {
         frame .frame
    
         scrollbar .frame.scroll \
             -command ".frame.canvas yview" \
             -relief raised
    
         canvas .frame.canvas \
             -yscroll ".frame.scroll set" \
             -scrollregion {0 0 0 650} \
             -relief raised \
             -confine false \
             -scrollincrement 25
    
         pack append .frame \
             .frame.scroll    {left frame center filly} \
             .frame.canvas    {left frame center fillx filly}
    
         pack append .\
             .frame   {left frame center fillx filly}
    
         button .frame.canvas.action  \
             -relief raised \
             -text "Action" \
             -command "multi_action"
         .frame.canvas create window 1 25 \
             -anchor w \
             -window .frame.canvas.action
         for {set i 2} {$i > 26} {incr i} {
             button .frame.canvas.button$i  \
                -relief raised \
                -background "#060" \
                -foreground wheat \
                -activebackground "#080" \
                -activeforeground wheat \
                -text "Button $i" 
             set id [.frame.canvas create window 1 [expr $i*25] \
                -anchor w \
                -window .frame.canvas.button$i]
             .frame.canvas.button$i configure \
                -command "multi_activate $i $id"
        }
      }
    
      setup
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.4- テキストウィジェットを 会話的にリサイズ出来るようにpackするには?

    A2.F.4. Spencer W. Thomas (spencer@med.umich.edu)によれば, 次のようにする必要があるそうです.
      wm minsize . 0 0
      text .text
      pack append . .text {fill expand}
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.5- 大文字の名前を持つウィジェットを作るには?

    A2.F.5. 最近の Tk では大部変更があって, 大文字ではじまる名前はクラス名として受け取られるようになりました. ウィジェットのインスタンスを指定するには, 小文字で始めなければなりません.これは,X11 のリソース定義で, クラスとインスタンスを区別する事を可能にしてくれます.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.6- 等しいサイズのボタンを作るには?

    A2.F.6. 最近, Micael Salmon (etxmesa@eos.ericsson.se)が投稿した内容によると:
    記事 <1993Jun23.065417.4302@ericsson.se>で, 私の書いたことによると:
      |> 私は現在,もう 1 つの tn3270 端末を開発してるのですが,同じサイズの
      |> ボタンを生成するところで躓いてます.PF とカーソルキーのためにボタン
      |> の配列を生成したのですが,それらを,みんな同じ大きさにしたいのです.
      |> それらを一列に配置する事は問題ではありませんでした.が,それらにビッ
      |> トマップを表示させると,水平位置がずれてしまうのです.ボタンの,水
      |> 平・垂直サイズを winfo で読み取り,それらの最大サイズにあわせてサイ
      |> ズを統一するよう pad を入れたのですが,どうもうまく動きません.
      |> ビットマップとテキストを混用して,テキストボタンでピクセル単位にサ
      |> イズ指定するのに,水平・垂直サイズをプリセットする技はうまくない様
      |> です.どなたか助言頂けませんか?
    
    Jim Wight (J.K.Wight@newcastle.ac.uk) は, reqheight と reqwidth を用い, 各ボタンの pack コマンドで padx と pady を指定する事を助言しました. Jim の言うには:
    私がこのグループに投稿した, 最初の回答の試みに欠けてるものを補うにはどうしたらいいかという記事に対して, reqwidth と reqheight を使うようにと答えてくれた Tuomas Tuomas J Lukka (lukka@klaava.Helsinki.FI)の回答が いいと思います.
    余計な話は抜きにして, 私が Michael にメールした,最終版の解決法を,以下に示します.
      frame .frame1
      frame .frame2
      button .frame1.a -text "pretty long button text"
      button .frame1.b -text "short one"
      button .frame2.c -bitmap "@/usr/include/X11/bitmaps/xlogo32"
      button .frame2.d -text "tiny"
    
      set long [winfo reqwidth .frame1.a]
      set short [winfo reqwidth .frame1.b]
      set medium [winfo reqwidth .frame2.c]
      set tiny [winfo reqwidth .frame2.d]
      set pady [expr [winfo reqheight .frame2.c]-[winfo reqheight .frame2.d]]
    
      pack append .frame1 .frame1.a "filly pady $pady"
      pack append .frame1 .frame1.b "fillx padx [expr $long-$short] filly pady $pady"pack append .frame2 .frame2.c "fillx padx [expr $long-$medium] filly"
      pack append .frame2 .frame2.d "fillx padx [expr $long-$tiny] filly pady $pady"
      pack append . .frame1 {left} .frame2 {left}
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.7- フォントによらず,縦にきれいに並ぶラジオボタンを作るには?

    A2.F.7. Till Brychcy (brychcy@informatik.tu-muenchen.de) が, 以下のような例題を示してくれてます.
            radiobutton .times -text Times -anchor w
            radiobutton .helvetica -text Helvetica -anchor w
            radiobutton .courier -text Courier -anchor w
            pack .times .helvetica .courier -side top -fill x
    
    pack コマンドにではなく, ウィジェットそれ自信のオプションでanchorをwestに指定する点に注意して下さい. こうすると,packer は幅一杯のボタンにしてくれます.
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.8- ある文字列でエントリウィジェットを初期化してしまうには?

    A2.F.8. Peter Kesch (kesch@kappco.kapp-coburg.de)が, 1 つの例題を提示してくれました.
      set default "foobar"
      entry .foo -width 25 -state disabled -textvariable default
    
    →目次へ

    From: -II- Tk の質問と回答 - 〜するにはどうするの?:
    Subject: -Q2.F.9- Tkでデフォルトの表示色を変更するには?

    A2.F.9. Tkのデフォルトの表示色を変えるには, Xリソースデータベースを変更する必要があります. これは,(.Xdefaultsファイルなどの), いつもXリソースの追加/変更に使っているどんな方法を取っても行う事ができますし, Tkアプリケーション内部からも,Tk "e;option"e;コマンドを使って オプションデータベースを変更する方法をとることもできるでしょう. rpeck@java.nas.nasa.gov (Rodney C. Peck) は, 以下の色設定リソース見本を提供してくれました.
          Tk*activeBackground:                    #efefef
          Tk*activeForeground:                    black
          Tk*selector:                            black
          Tk*background:                          #dfdfdf
          Tk*foreground:                          black
          Tk*selectBackground:                    #bfdfff
          Tk*Scale.activeForeground:              #efefef
          Tk*Scale.sliderForeground:              #dfdfdf
          Tk*Scrollbar.foreground:                #dfdfdf
          Tk*Scrollbar.activeForeground:          #efefef
          Tk*Button.disabledForeground:           #7f7f7f
          Tk*Checkbutton.disabledForeground:      #7f7f7f
          Tk*Radiobutton.disabledForeground:      #7f7f7f
          Tk*Menu.disabledForeground:             #7f7f7f
    
    より詳細な情報は, 使用しているシステムのXリソースの読み込みに関するドキュメントや, Tkのマニュアル・ページの"e;option"e;の項を参照して下さい.
    →目次へ


    From: -II- Tk Questions and Answers - How can I:
    Subject: -Q2.F.10- packコマンドで使う際に,非表示状態のウィンドウを見つけるには?

    A2.F.10. 状況は以下の通り:
    ウィンドウが,例えば .w1 として生成され, さらに別のウィンドウ .w2 が生成されたとします. コマンド "e;pack .w1 -in .w2"e; は, .w2の内側に.w1をパックするのに使われます. packコマンドは完全に成功し,"e;pack newinfo .w1"e;は, 意図した通りの結果を返します.しかしながら,.w1は表示されないのです! 何が悪いのでしょう?
                 button .w1 -text button;   # .w1 を生成
                 frame .w2;                 # .w2 を生成
                 pack .w1 -in .w2;          # .w1 を .w2 の内側にpack
                 pack .w2;                  # .w2 をメインウィンドウにpack
                                            # buttonは,何処にいったの?
    
    回答:
    (js@aelfric.bu.edu (Jay Sekora)の投稿から)

    短く言ってしまうと,"e;raise .w1"e;. 例題では,.w1は正しく.w2の内側に置かれていますし, 互いの大きさによる.w1と.w2とのサイズ調整も正しく動作しています. ただ,.w1は.w2の「裏側」にいるのです. なぜなら,デフォルトでは, ウィンドウは生成された順番でスタック方式に記憶されるからです. スタック内のウィンドウの順番は, 明示的に"e;raise"e;コマンドを実行することで変更でき, この場合では,"e;raise .w1"e;がそれにあたります.

    →目次へ

    From: -II- Tk Questions and Answers - How can I:
    Subject: -Q2.F.11- '.'以外の全てのウィンドウを破壊するには?

    A2.F.11. tromey@klab.caltech.edu (Tom Tromey)からの投稿を基にすると:
    アプリケーション中の各ウィンドウを破壊するには,`destroy'コマンドを使います. 以前の版のTkでは,destroyは1引数しか受け付けませんでした. が,現在は可変引数個の破壊すべきウィンドウ名(のリスト)を受け付けます. したがって,求めることを行うには,以下のようにしてやります:
       eval destroy [winfo children .]
    
    子ウィンドウ名は,可変個の空白で区切られたリスト形式で返され得ますので, evalコマンドが必要です.こうすれば,destroyに長い文字列としてではなく, 個々のウィンドウ名として渡されます.
    →目次へ

    From: -II- Tk Questions and Answers - How can I:
    Subject: -Q2.F.12- ラジオボタンの集まりを一緒にグループ化するには?

    A2.F.12. この回答はMichael Salmonから提供されました:
    ラジオボタンをグループ化するには,同じグループに属させたいボタン全てに, 同じ変数名の変数を割り振ればよいのです.(ラジオボタンの)デフォルトの 変数名はselectedButtonですので,-variable指定を行わなければ,全ての ラジオボタンは同じグループとなります.
    例題:
    radiobutton .left.button1 -text "Left button 1"  -variable leftChoice
    radiobutton .left.button2 -text "Left button 2"  -variable leftChoice
    radiobutton .left.button3 -text "Left button 3"  -variable leftChoice
    
    radiobutton .right.button1 -text "Right button 1" -variable rightChoice
    radiobutton .right.button2 -text "Right button 2" -variable rightChoice
    radiobutton .right.button3 -text "Right button 3" -variable rightChoice
    
    →目次へ

    comp.lang.tcl Tk ツールキットの使用に関する良くある質問と回答集 (1/1) 終り