質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Ruby

    9172questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

【RubyGTK3】RubyGTK3を使ったプログラムのexe化について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,653
退会済みユーザー

退会済みユーザー

前提・実現したいこと

Rubyでデスクトップマスコット(現時点では透過pngを画面に表示するだけ)の制作を目指しています。
できあがったプログラムをocraでexe化しようとすると
「`validate_arguments': Gio::Icon.hash: wrong number of arguments (0 for 1)」が発生します。

この問題を解決したいです。

発生している問題・エラーメッセージ

=== Loading script to check dependencies
=== Attempting to trigger autoload of Gem::ConfigFile
=== Attempting to trigger autoload of Gem::DependencyList
=== Attempting to trigger autoload of Gem::DependencyResolver
=== Attempting to trigger autoload of Gem::Installer
=== Attempting to trigger autoload of Gem::Licenses
=== Attempting to trigger autoload of Gem::RequestSet
=== Attempting to trigger autoload of Gem::Source
=== Attempting to trigger autoload of Gem::SourceList
=== Attempting to trigger autoload of Gem::SpecFetcher
C:/Ruby23/lib/ruby/gems/2.3.0/gems/gobject-introspection-3.1.0-x86-mingw32/lib/gobject-introspection/loader.rb:640:in `validate_arguments': Gio::Icon.hash: wrong number of arguments (0 for 1) (ArgumentError)
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gobject-introspection-3.1.0-x86-mingw32/lib/gobject-introspection/loader.rb:589:in `build'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/gobject-introspection-3.1.0-x86-mingw32/lib/gobject-introspection/loader.rb:101:in `block in define_singleton_method'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:470:in `block (2 levels) in attempt_load_autoload'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:469:in `each'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:469:in `block in attempt_load_autoload'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:463:in `loop'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:463:in `attempt_load_autoload'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:715:in `build_exe'
        from C:/Ruby23/lib/ruby/gems/2.3.0/gems/ocra-1.3.6/bin/ocra:1177:in `block in <top (required)>'

該当のソースコード

require"gtk3"
=begin
これは背景が透明なウィンドウを表示して
そこに画像を表示するプログラムです
バツボタンが表示されないので、下のアイコンから閉じてください。
動かすのに必要なもの
・Ruby
・gtk3
・image.pngという名前の画像(6.のファイル名を変更するなら名前は何でもよい。)
=end

window = Gtk::Window.new                              #1.ウィンドウを作ります。


window.signal_connect("destroy"){Gtk.main_quit}       #2.ウィンドウがdestroyされたら終了。

window.decorated = false                              #3.ウィンドウの枠を消します。trueにすると表示されます。

window.keep_above = true                              #4.ウィンドウを常に最前面に表示するようにします。

color = Gdk::RGBA::new(0, 0, 0, 0)                    #5.色を決めます。数値は0 ~ 1で設定します。数値の順番はRGBAでAが0なら他は何でもよいです。

window.override_background_color(0, color)            #6.ウィンドウの背景色を変更します。0にしないと背景色が変わりません。

image = Gtk::Image.new(:file => "image.png")          #7.画像を読み込みます。

window.add(image)                                     #8.ウィンドウに加えます。

window.show_all                                       #9.ウィンドウに載っているものをすべて表示します。

Gtk.main                                              #10.ループ

試したこと

ここに書いてあることを参考にして書いてみました。 結果:undefined method `new_for_string' for Gio::Icon:Module (NoMethodError)が発生した。
ここを探してみましたが「Gio::Icon.hash」は見つかりませんでした。
ここを参考にプログラムを起動しないでexe化してみました。
結果:exe化はできたが「require : cannnot load such file -- gtk3(LoadError)」が発生して動かない。
Rubyのバージョンを変更してみました。Rubyは全て32bit版をRubyInstllerからダウンロードしました。
結果:2.0.0だとGTK3をダウンロードしているところでエラーが発生します。2.1.9, 2.2.6, 2.3.3はGTK3をダウンロードして上のプログラムを動かすことはできましたが、ocraを使うと同じエラーが発生します。

補足情報(言語/FW/ツール等のバージョンなど)

ruby 2.3.1
gtk3 3.1.0
ocra 1.3.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

C#を利用して解決しました。

C#/WPFで作るデスクトップマスコット入門
アプリケーションのアイコンを変更する

これらのサイトのおかげでやりたかったことができました。

これからC#の勉強をしようと思います。

追記

# encoding: utf-8

require'qt'

class DesktopMascot < Qt::MainWindow
  def initialize
    super
    # ウィンドウにセットするラベルの設定
    label = Qt::Label.new
    base = Qt::Image.new('character/000000/1.png')
    # base = base.mirrored(true, false) => 画像の反転
    # base = base.scaled(500, 500, Qt::KeepAspectRatio, Qt::SmoothTransformation) => リサイズ
    pix = Qt::Pixmap::fromImage(base)
    label.setPixmap(pix)
    effect = Qt::GraphicsDropShadowEffect.new
    effect.setColor(Qt::Color.new(0, 0, 0))
    effect.setOffset(3, 3)
    effect.setBlurRadius(20)
    label.setGraphicsEffect(effect)

    # ウィンドウの設定
    setCentralWidget(label)
    setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint)
    setAttribute(Qt::WA_TranslucentBackground)

    # マウスで移動させるための設定
    @offset = Qt::Point.new
    @left = false

    # 各種アクション
    createAction()
  end

  def mousePressEvent(event)
    if event.button() && Qt::LeftButton
      @offset = event.pos()
      @left = true
    end
  end

  def mouseMoveEvent(event)
    if @left
      move(mapToParent(event.pos() - @offset))
    end
  end

  def mouseReleaseEvent(event)
    if event.button() && Qt::LeftButton
      @left = false
    end
  end

  def contextMenuEvent(event)
    menu = Qt::Menu.new(self)
    menu.addAction(@exitAct)
    menu.exec(event.globalPos())
  end

  def createAction()
    @exitAct = Qt::Action.new(tr('EXIT'), self)
    connect(@exitAct, SIGNAL('triggered()'), self, SLOT('close()'))
  end
end

app = Qt::Application.new(ARGV)

mascot = DesktopMascot.new
mascot.show

app.exec


qtbindingsというgemを利用します。
これならocraでexe化できます。(ただし、とても時間がかかる。)
起動にも時間がかかるので、Rubyにこだわらなければ他の言語で作った方がよさげです。
上のコードで、非矩形ウィンドウの作成とタイトルバーがない状態での
ドラッグ移動ができるようになっています。

参考
Qtでデスクトップマスコット的なのを実現する方法
QT4 Drag Window Without Title Bar
Moving object with mouse
widget透過のまとめ

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    9172questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。