2009-08-02 69 views
4

私は小さなアプリケーションを作成している必要がありますURLを受け取ることができます。アプリケーションウィンドウが開いている場合は、ブラウザからリンクをドラッグしてアプリにドロップする必要があります。アプリはそのURLをデータベースに保存します。Python GTKドラッグアンドドロップ - URLを取得

私はこれをPython/GTkで作成しています。しかし、私はそれにドラッグアンドドロップの機能について少し混乱しています。だから、どうやって?

ドラッグ/ドロップを(私のアプリは、このコードのビットを使用しています)を実装するためにいくつかのサンプルコード...

import pygtk 
pygtk.require('2.0') 
import gtk 

# function to print out the mime type of the drop item 
def drop_cb(wid, context, x, y, time): 
    l.set_text('\n'.join([str(t) for t in context.targets])) 
    # What should I put here to get the URL of the link? 

    context.finish(True, False, time) 
    return True 

# Create a GTK window and Label, and hook up 
# drag n drop signal handlers to the window 
w = gtk.Window() 
w.set_size_request(200, 150) 
w.drag_dest_set(0, [], 0) 
w.connect('drag_drop', drop_cb) 
w.connect('destroy', lambda w: gtk.main_quit()) 
l = gtk.Label() 
w.add(l) 
w.show_all() 

# Start the program 
gtk.main() 

答えて

8

あなたはデータを自分で取得しなければなりません。ここでは、URLにラベルを設定する簡単な作業例がドロップです:

#!/usr/local/env python 

import pygtk 
pygtk.require('2.0') 
import gtk 

def motion_cb(wid, context, x, y, time): 
    l.set_text('\n'.join([str(t) for t in context.targets])) 
    context.drag_status(gtk.gdk.ACTION_COPY, time) 
    # Returning True which means "I accept this data". 
    return True 

def drop_cb(wid, context, x, y, time): 
    # Some data was dropped, get the data 
    wid.drag_get_data(context, context.targets[-1], time) 
    return True 

def got_data_cb(wid, context, x, y, data, info, time): 
    # Got data. 
    l.set_text(data.get_text()) 
    context.finish(True, False, time) 

w = gtk.Window() 
w.set_size_request(200, 150) 
w.drag_dest_set(0, [], 0) 
w.connect('drag_motion', motion_cb) 
w.connect('drag_drop', drop_cb) 
w.connect('drag_data_received', got_data_cb) 
w.connect('destroy', lambda w: gtk.main_quit()) 
l = gtk.Label() 
w.add(l) 
w.show_all() 

gtk.main() 
+8

は注意してくださいデータがURIリストの形式であればdata.get_uris()を呼び出します。たとえば、konqueror/nautilusからウィンドウへのファイルのリストをDnDして、 'text/uri-list'を受け入れると、GtkSelectionDataのget_data()はNoneを返します。 –

+0

ウィンドウをドラッグしてテキストを保持するラベルのマウスを離さずにウィンドウウィンドウからドラッグすると、望ましくない動作が発生する可能性があります。ラベルをクリアする方が意味があるようです – demongolem

3

あなたのファイルエクスプローラからファイルのリストをDnD'ing上の一つのファイルやディレクトリのデータのみを取得することを確認するためには、あなたは可能性があり

data.get_text().split(None,1)[0] 

「got_data_cb」メソッドのコードは次のようになります:

def got_data_cb(wid, context, x, y, data, info, time): 
    # Got data. 
    l.set_text(data.get_text().split(None,1)[0]) 
    context.finish(True, False, time) 

これは空白でデータを分割し、あなたの最初の項目を返しますのようなものを使用。

1

私のために働い唯一の解決策は次のとおりです。

def got_data_cb(wid, context, x, y, data, info, time): 
    # Got data. 
    l.set_text(data.get_uris()[0]) 
    context.finish(True, False, time) 
0

次のコードは、私がthe accepted answerに影響を与えたが、pygiと推測されan example of the (old) PyGTK tutorialから移植されています。あなたがする必要があるかもしれないことに

#!/usr/local/env python 
import gi 
gi.require_version("Gtk", "3.0") 
from gi.repository import Gtk, Gdk 

def motion_cb(wid, context, x, y, time): 
    Gdk.drag_status(context, Gdk.DragAction.COPY, time) 
    return True 

def drop_cb(wid, context, x, y, time): 
    l.set_text('\n'.join([str(t) for t in context.list_targets()])) 
    context.finish(True, False, time) 
    return True 

w = Gtk.Window() 
w.set_size_request(200, 150) 
w.drag_dest_set(0, [], 0) 
w.connect('drag-motion', motion_cb) 
w.connect('drag-drop', drop_cb) 
w.connect('destroy', lambda w: Gtk.main_quit()) 
l = Gtk.Label() 
w.add(l) 
w.show_all() 

Gtk.main()