Ruby GTK 覚え書き

これは使えそう。STDIN を必要なファイルディスクリプタにすればよい。

require 'bundler/setup'
require 'gtk2'

w = Gtk::Window.new
w.set_size_request(200, 50)
w.set_resizable(false)
    
b = Gtk::VBox.new
w.add(b)
entry = Gtk::Entry.new
entry.set_editable(false)
b.pack_start(entry)

ioc = GLib::IOChannel.new(STDIN)
ioc.add_watch(GLib::IOChannel::IN) do |io|
  st = io.readline.chomp
  entry.set_text(st)
  true    #繰り返す
end

context = GLib::MainContext.default
mainloop = GLib::MainLoop.new(context, true)

w.signal_connect("destroy") {mainloop.quit}
w.show_all

mainloop.run
ioc.close

参考:
https://github.com/taf2/ruby-gnome2/blob/master/glib/sample/iochannel.rb#L24
C言語/GTKでファイルやらソケットやらのfdが読み込み(or書き込み)可能になるのを待ちたい。 - BlankTar
 

サンプル(9/17)

サーバー側。こちらが先に起動。

require 'bundler/setup'
require 'gtk2'
require 'socket'

module Sample
  class MyWindow < Gtk::Window
    def initialize
      super("Sample")
      set_size_request(200, 60)
      set_resizable(false)
      
      entry = Gtk::Entry.new
      entry.set_editable(false)
      entry.set_height_request(40)
      entry.modify_font(Pango::FontDescription.new("13"))
      add(entry)
      
      io = (ARGV[0] == "-s") ? TCPServer.open(29753) : STDIN
      
      Thread.new(io) do |io|
        ioc = GLib::IOChannel.new((io.class == IO) ? io : io.accept)
        ioc.add_watch(GLib::IOChannel::IN) do |i|
          st = i.gets
          next unless st
          entry.set_text(st.chomp)
          true    #繰り返し
        end
      end
      
      signal_connect("destroy") {Gtk.main_quit}
      show_all
    end
  end
  
  def self.run
    MyWindow.new
    Gtk.main
  end
end

Sample.run

 
クライアント側。

require 'socket'

TCPSocket.open("localhost", 29753) do |sock|
  st = "Hello, World!"
  st.length.times do |i|
    sock.puts st[0, i + 1]
    sleep(1)
  end
end

単純にこんなのでも。

require 'socket'

TCPSocket.open("localhost", 29753) do |sock|
  loop {sock.puts(gets)}
end