GUIにとりかかる

Last-modified: 2018-06-27 (水) 20:29:05
 

言葉だけ操るのも飽きてきたので、気分転換でGUIにとりかかりました。

 

なんとか画像を表示させるまで

やはり、開発のモチベーションを上げるためには、見た目が大事ということで、画像を表示するまでを最優先でやってみました。

 

gui.rb

 require 'gtk3'
 win = Gtk::Window.new()
 #### 次のコードで「閉じる」を押すと、プログラムは終了。
 win.signal_connect("destroy") { Gtk.main_quit }
 #### 縦の箱を用意
 vbox = Gtk::Box.new(:vertical, 10)
 ibox = Gtk::Image.new(:file => "yome.png")
 yome_text = Gtk::TextView.new
 yome_text.set_size_request(240, 100)
 yome_text.buffer.text = "バカ、死ね、カス!"
 vbox.pack_start(ibox)
 vbox.pack_start(yome_text)
 win.add(vbox)
 win.show_all
 Gtk.main

お好みの画像を用意して、yome.pngとリネームして、gui.rbと同じフォルダに置いてください。
(×をクリックすると閉じる以外)何もできませんが、気持よく罵られます。

 

表示例

gui.rb_030.jpg

あれ?なんだか思っていたのと違う。。。

 
 

殺伐とした会話を交わせるようにした

dialogue.rb を移植して、会話らしきものが交わせるようにしてみました。
なお、コードは、Githubから入手するのが手っ取り早いと思います。

 

gui.rb

 require 'gtk3'
 require 'yaml'
 require 'natto'
 require 'pp'
 #### Ui クラスを定義
 class Ui
   def initialize
     @markov_dic = YAML.load_file 'MARKOV_DIC.yaml'
   rescue
     @markov_dic = []
   end
   def make_window
     win = Gtk::Window.new
     #### 次のコードで「閉じる」を押すと、プログラムは終了。
     win.signal_connect('destroy') { Gtk.main_quit }
     win.set_border_width(10)
     #### 縦の箱を用意
     vbox = Gtk::Box.new(:vertical, 10)
     #### 上から画像、無脳ちゃん(仮)の言葉、こちらの入力欄を置く
     ibox = Gtk::Image.new(file: 'yome.png')
     tp = Gdk::RGBA.new(1.0, 0.5, 1.0, 0.5)
     ibox.override_background_color(:normal, tp)
     yome_area = Gtk::TextView.new
     yome_area.set_size_request(240, -1)
     yome_area.set_cursor_visible(false)
     yome_area.set_editable(false)
     yome_area.buffer.text = 'ヨメ(仮)> 何か用事なの?私だって忙しんだからね。そうそう『バイバイ」でさよならよ。'
     ore_area = Gtk::Entry.new
     ore_area.set_size_request(240, -1)
     ore_area.signal_connect('activate') do |e|
       @entry = e.text
       if @entry == 'バイバイ' || @entry == 'ばいばい'
         puts @entry
         YAML.dump(@markov_dic, File.open('MARKOV_DIC.yaml', 'w'))
         yome_area.buffer.text = 'ヨメ(仮)> じゃ、またね。 ×を押して終了してね。'
         exit
       end
       ore_strings
       yome_strings
       yome_area.buffer.text = @output
       e.text = ''
     end
     vbox.pack_start(ibox, expand: true, fill: true, padding: 0)
     vbox.pack_start(yome_area, expand: true, fill: true, padding: 0)
     vbox.pack_start(ore_area, expand: true, fill: true, padding: 0)
     ore_area.grab_focus
     win.add(vbox)
     win.show_all
     Gtk.main
   end
   def ore_strings
     ## 単語分割し、配列に代入
     parse_ore = Natto::MeCab.new
     parsed_str = []
     parse_ore.parse(@entry) do |line|
       parsed_str.push line.surface
     end
     ## マルコフ連鎖用辞書に収録
     cycle = parsed_str.size - 3
     cycle.times do |key1, key2, val|
       key1 = parsed_str[0]
       key2 = parsed_str[1]
       val = parsed_str[2]
       keys = [key1, key2]
       cell_arr = [keys, val]
       @markov_dic.push cell_arr
       parsed_str.shift
     end
     @markov_dic.uniq!
     @markov_dic.shuffle!
     ## 嫁の返事のキーワードとなる名詞をランダムに抜き出す。
     ore_words = []
     parse_ore.parse(@entry) do |line|
       if line.feature =~ /固有名詞/ || line.feature =~ /名詞,サ変接続/ || line.feature =~ /名詞,一般/
         ore_words.push line.surface
       end
     end
     @keyword = ore_words[rand(ore_words.size)]
   end
   def yome_strings
     @yome_strings = ['ヨメ(仮)> え!? 嘘でしょ? もー、信じらんない! ']
     @markov_dic.each do |line|
       if line[0][0] == @keyword
         if @keyword == '。' || @keyword == '?'
           @yome_strings.push @keyword
           break
         end
         @yome_strings.push line[0][0]
         @yome_strings.push line[0][1]
         @keyword = line[1]
         next if @keyword != line[0][0]
         yome_strings @keyword
       end
     end
     @yome_strings.push ' バカ、死ね、カス!'
     @output = @yome_strings.join
     @yome_strings = ['ヨメ(仮)> ']
   end
 end
 Ui.new.make_window

画像はこんな感じ。ポートレートを差し替えてみたが、色んな意味でまだまだ直すべきところは多い。

gui_3.jpg