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
スクリプトを実行して表示されたウインドウに、エクスプローラからファイルをD&Dしてみた。
できたっぽい。
が、日本語ファイル名は、たしかに化けてるな…。
_[ruby-list:49771] TkDND での日本語名の扱い で紹介されてる変換処理を入れてみた。ついでに、複数ファイルを渡した時に全部処理するようにしてみた。
_tkdnd_test2.rb
文字化けしてないように見える。
が。 _[ruby-list:50353] [再]Re: TkDND での日本語名の扱い によると、空白が入ったファイル名を渡したり、\が入ったファイル名を渡すとおかしくなるそうで。試してみたところ、たしかにエラーが表示された。このあたり、なかなか厳しいものがあるようで。
参考ページは以下。
_[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してみた。
できたっぽい。
が、日本語ファイル名は、たしかに化けてるな…。
_[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
文字化けしてないように見える。
が。 _[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 なるパッケージマネージャを使ってネット経由でインストール。
最後に、Ruby/Tk からTk拡張を使えるようにする。
このあたりは色々やり方があるらしいけど、自分の環境ではこの方法でやってたり。昔試した時は、この方法なら ocra を使ってRubyスクリプトをexe化する時も問題が出なかったはず。
_2016/10/03の日記 や、 _2015/12/10の日記 にもそのへんメモしてあった、とメモ。
とりあえず、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の日記 にもそのへんメモしてあった、とメモ。
[ ツッコむ ]
以上です。