From: nkon@...2.3web.ne.jp Date: 1997-11-01T10:58:38+09:00 Subject: [ruby-list:5203] Tk の使い方 近藤と申します。 お絵書きアプリケーションを作っているのですが、 うまく、動きません。添削していただけないでしょうか。 以下は、作っているプログラムを簡単に直したものです。 環境は、 ruby - version 1.0-971003 (i586-linux) wish 4.2jp (libtcl7.6jp, libtk4.2jp) です。 プログラムの構成としては、 各データファイルごとに class Cet のインスタンスを作成して、 toplevel window を作成します。root window はwithdraw で表示しません。 問題点は、 1. Manager#initialize で Tk.after 1000, Proc.new{@root.withdraw} で root window を消しているのですが、root window がうまく消される時 と、ずっと表示されたままの時があります。表示されたままの時が多いで す。 2. Cet#initialize で widgets を作成しているのですが、canvas に scrollbar をつけています。最初は、思った通りに表示されているのです が、scrollbar を動かしたら、突然終了してしまいます。 以上、どのようにしたら良いでしょうか。 また、皆様のデバッグ方法などについて教えて下さい。 よろしくお願い致します。 -- *** メイルアドレス変わりました *** 近藤靖浩 http://www2.osk.3web.ne.jp/~nkon/3web/ http://tsl.pe.u-tokyo.ac.jp/~kon/tslhome/ ---- プログラムファイル require "tkclass" class Manager def initialize @windows = [] # 見えない root window を作成 @root = TkRoot.new Tk.after 1000, Proc.new{@root.withdraw} end def newcreate filename = "/CET_NEW_FILE." filename += @windows.size @windows += Cet.new(filename) return @windows[@windows.size - 1] end def get_root return @root end end # cet.rb class Cet def initialize(filename) @filename = filename; # 窓の初期化 @toplevel = TkToplevel.new($manager.get_root) @toplevel.title(@filename) # Menu Bar @menuframe = TkFrame.new(@toplevel, {"border" => 1, "relief" => "raised"}) print @menuframe.path, "\n" if $VERBOSE # File Menu @menu_file = TkMenubutton.new(@menuframe, {"text" => "File", "underline" => 0}); @menu_file_m = TkMenu.new(@menu_file, {"tearoff" => "no"}) @menu_file_m.add("command", \ {"label" => "New", "underline" => 0, \ "command" => proc{$manager.new}}) @menu_file.menu(@menu_file_m); @menu_file.pack({"side" => "left"}) # Canvas Area @canvasframe = TkFrame.new(@toplevel); #print @canvasframe.path, "\n" if $VERBOSE @canvas = TkCanvas.new(@canvasframe, {"bg" => "gray80", \ "width" => 600, "height" => 480, \ "scrollregion" => "0 0 600 480", \ "relief" => "raised", "border" => 1}); #print @canvas.path, "\n" if $VERBOSE @h_scroll = TkScrollbar.new(@canvasframe, {"relief" => "sunken", \ "orient" => "horizontal", \ "command" => @canvas.yview}); print @h_scroll.path, "\n" if $VERBOSE @v_scroll = TkScrollbar.new(@canvasframe, {"relief" => "sunken", \ "orient" => "vertical", \ "command" => @canvas.xview}); print @v_scroll.path, "\n" if $VERBOSE @canvas.configure("xscrollcommand", @h_scroll.path+" set"); @canvas.configure("yscrollcommand", @v_scroll.path+" set"); @v_scroll.pack({"side" => "right", "fill" => "y"}); @h_scroll.pack({"side" => "bottom", "fill" => "x"}); @canvas.pack "fill" => "both", "expand" => "yes"; @menuframe.pack({"side" => "top", "fill" => "x"}); @canvasframe.pack({"side" => "top", "fill" => "both", "expand" => "yes"}); end; end # main # アプリケーションマネージャの作成 $manager = Manager.new $manager.newcreate # Cet アプリケーションの作成 Tk.mainloop