mieki256's diary



2016/10/13(木) [n年前の日記]

#1 [ruby] Windows10 + Ruby/Tk でエクスプローラからファイルをD&Dしてファイルパスを取得

Windows10 x64 + Ruby 2.2.5 p319 + Ruby/Tk + TkDND 2.8 で、エクスプローラからファイルをD&D(ドラッグアンドドロップ)して、ファイルパスを取得できるか実験。

参考ページは以下。

_[ruby-list:49771] TkDND での日本語名の扱い
_DebianでRubyからTcl/TkのTkDNDを利用してドラッグアンドドロップを実装する -- ぺけみさお

_tkdnd_test.rb
# Ruby/Tk + tkDND でファイルのドロップを受け付けるかテスト
# Tk拡張を導入していないと動作しない。
#
# [ruby-list:49771] TkDND での日本語名の扱い
# http://ruby-list.ruby-lang.narkive.com/lx7VFWDo/ruby-list-49771-tkdnd
#
# DebianでRubyからTcl/TkのTkDNDを利用してドラッグアンドドロップを実装する -- ぺけみさお
# https://www.xmisao.com/2013/07/25/ruby-tkdnd-linux.html

require 'tk'
require "tkextlib/tkDND"

Tk::TkDND::DND

label = TkLabel.new {
  text "Please File Drop"
  pack
}

txt = TkText.new(nil){
  dnd_bindtarget('text/uri-list','<Drop>', "%D") { |d|
    p d
    insert('end',d[0])
    insert('end',"\n")
  }
  pack
}

TkButton.new {
  text "Exit"
  command "exit"
  pack
}

Tk.mainloop

スクリプトを実行して表示されたウインドウに、エクスプローラからファイルをD&Dしてみた。

tkdnd_test_rb_ss.png

できたっぽい。

が、日本語ファイル名は、たしかに化けてるな…。

_[ruby-list:49771] TkDND での日本語名の扱い で紹介されてる変換処理を入れてみた。ついでに、複数ファイルを渡した時に全部処理するようにしてみた。

_tkdnd_test2.rb
require 'tk'
require "tkextlib/tkDND"
require 'nkf'

Tk::TkDND::DND

label = TkLabel.new {
  text "Please File Drop"
  pack
}

txt = TkText.new(nil) {
  dnd_bindtarget('text/uri-list','<Drop>', "%D") { |d|
    d.each { |s|
      # 日本語ファイル名を渡した時におかしくなるので変換処理をする
      u8str = s.encode("iso-8859-1","utf-8").encode("iso-8859-1","utf-8")
      u8str.encode!('cp932', 'utf-8')
      
      puts u8str
      insert('end',u8str)
      insert('end',"\n")
    }
  }
  pack
}

TkButton.new {
  text "Exit"
  command "exit"
  pack
}

Tk.mainloop
tkdnd_test2_rb_ss.png

文字化けしてないように見える。

が。 _[ruby-list:50353] [再]Re: TkDND での日本語名の扱い によると、空白が入ったファイル名を渡したり、\が入ったファイル名を渡すとおかしくなるそうで。試してみたところ、たしかにエラーが表示された。このあたり、なかなか厳しいものがあるようで。

TkDNDの導入方法。 :

Windows10 x64 + Ruby 2.2.5 p319 + Ruby/Tk の環境で、TkDND も含めたTk拡張(?)を使うには…。

とりあえず、ActiveTcl が必要。 _Download Tcl | ActiveState から入手してインストールする。たしか、自分の環境では、Windows x86(32bit版)、8.6.4.1 をインストールしたような。 セットアップファイルは、ActiveTcl8.6.4.1.299124-win32-ix86-threaded.exe、だった気がする。

次に、ActiveTcl に、TkDND をインストールする。tclsh と打つとプロンプトが「%」になるので、ActiveTcl についてきた teacup なるパッケージマネージャを使ってネット経由でインストール。
% teacup install tkdnd
インストールできたら、exit と打って抜ける。

最後に、Ruby/Tk からTk拡張を使えるようにする。
ActiveTclインストールフォルダ\lib\teapot\package\win32-ix86\lib\
の中に入ってるファイルやフォルダを、
Ruby2.2インストールフォルダ\lib\tcltk\
の中にごっそりコピー。

このあたりは色々やり方があるらしいけど、自分の環境ではこの方法でやってたり。昔試した時は、この方法なら ocra を使ってRubyスクリプトをexe化する時も問題が出なかったはず。

_2016/10/03の日記 や、 _2015/12/10の日記 にもそのへんメモしてあった、とメモ。

以上です。

過去ログ表示

Prev - 2016/10 - Next
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project