言葉だけ操るのも飽きてきたので、気分転換で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と同じフォルダに置いてください。
(×をクリックすると閉じる以外)何もできませんが、気持よく罵られます。
表示例
あれ?なんだか思っていたのと違う。。。
殺伐とした会話を交わせるようにした
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
画像はこんな感じ。ポートレートを差し替えてみたが、色んな意味でまだまだ直すべきところは多い。

