GTK+ でスクロールするテキスト・ウィンドウを作る(Ruby)
Ruby で GTK+ を使ってテキストを表示させるウィンドウを作ってみました。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)- ボタン