D&Dを実装するのは意外と簡単で、wx.FileDropTargetクラスを使用します。
早速スクリプトを見ていきます。
# -*- coding: UTF-8 -*-
import wx
class FileDropTarget(wx.FileDropTarget):
""" Drag & Drop Class """
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, files):
self.window.text_entry.SetLabel(files[0])
return 0
class App(wx.Frame):
""" GUI """
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(500, 200), style=wx.DEFAULT_FRAME_STYLE)
# パネル
p = wx.Panel(self, wx.ID_ANY)
label = wx.StaticText(p, wx.ID_ANY, 'ここにファイルをドロップしてください', style=wx.SIMPLE_BORDER | wx.TE_CENTER)
label.SetBackgroundColour("#e0ffff")
# ドロップ対象の設定
label.SetDropTarget(FileDropTarget(self))
# テキスト入力ウィジット
self.text_entry = wx.TextCtrl(p, wx.ID_ANY)
# レイアウト
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(label, flag=wx.EXPAND | wx.ALL, border=10, proportion=1)
layout.Add(self.text_entry, flag=wx.EXPAND | wx.ALL, border=10)
p.SetSizer(layout)
self.Show()
app = wx.App()
App(None, -1, 'タイトル')
app.MainLoop()
<結果> ↓ ↓ ↓
上記スクリプト内で、過去に解説した内容については省略致します。
ご確認いただきたい場合は、pythonでGUIツールを作る ~基礎編~をご覧ください。
続いて解説を行います。
- - - 詳細 - - - - - - - - - - - - -
class FileDropTarget(wx.FileDropTarget):
""" Drag & Drop Class """
def __init__(self, window):
wx.FileDropTarget.__init__(self)
self.window = window
def OnDropFiles(self, x, y, files):
self.window.text_entry.SetLabel(files[0])
この部分がwx.FileDropTargetクラスです。OnDropFiles関数の部分で、テキスト入力ウィジットにドロップしたファイルのパスを出力します。
このとき、filesはリストであり、ドロップしたもののパスがすべて格納されています。
xとyには座標が格納されています。(使った記憶はありませんが・・・。)
# ドロップ対象の設定
label.SetDropTarget(FileDropTarget(self))
wx.FileDropTargetクラスを実装しただけではD&Dは使用できません。どのウィジットに対してD&Dを許可するかを指定する必要があります。
今回はwx.StaticTextに対してD&Dを許可していますので、その他の部分にはドロップできないようになっています。
例えば、フレームのどの部分でもD&Dを許可したい場合は次のように記述します。
self.SetDropTarget(FileDropTarget(self))
先頭部分がlabelからselfに変わっただけです。これでフレームのどこでもD&Dを受け付けるようになります。
- - - - - - - - - - - - - - - - - -
自作のGUIツールにD&Dがあるのとないのでは雲泥の差があるといっても過言ではないでしょう。
ファイルひとつ選択する作業でも、ファイル選択ダイアログからいちいちファイルを指定するよりもマウスでクイッと指定できたほうがとても楽です。
作業効率の面でも、ぜひ実装するべきだと考えます。
0 件のコメント:
コメントを投稿