GTK+ でスクロールするテキスト・ウィンドウを作る(Ruby)

RubyGTK+ を使ってテキストを表示させるウィンドウを作ってみました。Gem 'gtk2' を使っています。
 

window = ScrolledTextWindow.open

5.times do |i|
  window.write "send #{i}"
  window.write "  ok!\n"
  sleep(rand(2) + 1) 
end
  
window.close

これでこんな風に表示されます。

write で改行のたびにリアルタイムで書き込まれます。スクロールもします。ただし、残念ながら close してもウィンドウは消えません。ウィンドウのボタンで消去して下さい。
ウィンドウの縦横幅、タイトルを指定することもできます。ScrolledTextWindow.open(width: 300, height: 200, title: "Window") みたいな感じ。

scrolled_text_window.rb

require 'gtk2'

class ScrolledTextWindow
  def self.open(width: 500, height: 200, title: "Text Window")
    #IO{read, write}, Gtk::Window{w}, Gtk::ScrolledWindow{sw}, Gtk::TextView{t}
    #Gtk::TextBuffer{b}, control
    
    read, write = IO.pipe
    control = Object.new
    
    control.define_singleton_method(:write) do |text|
      write.print text
    end
    
    control.define_singleton_method(:close) do  
      write.close
    end
    
    fork do
      write.close
      
      w = Gtk::Window.new
      w.signal_connect("destroy") {Gtk.main_quit}
      w.set_size_request(width, height)
      w.title = title
      
      sw = Gtk::ScrolledWindow.new
      sw.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
      
      t = Gtk::TextView.new
      t.modify_font(Pango::FontDescription.new("12"))
      sw.add(t)
      w.add(sw)
      
      b = t.buffer
      Thread.new(t, b) do |t, b|
        loop do
          b.insert_at_cursor(read.gets)
          t.scroll_mark_onscreen(b.create_mark(nil, b.end_iter, true))
        end
      end
      
      Gtk.quit_add(0) {read.close}
      w.show_all
      Gtk.main
    end
    
    read.close
    control
  end
end

 

※参考
GTK+ で簡単なテキスト入力(Ruby) - Marginalia
noanoa 日々の日記 : Ruby/GTK2,GTK3 プログラミング Tips(3)- ボタン