web-dev-qa-db-ja.com

ウィンドウ全体を外部入力のドロップターゲットにする簡単な方法はありますか?

例:
空き地で設計されたウィンドウにファイルをドロップすると、Handler.open_from_path(path)がトリガーされます

2
RobotHumans

ウィンドウの「main_win」ウィジェットのdrag_data_receivedコールバックをon_main_win_drag_data_receivedに設定します。 URIはステータスバーに出力されます。

from gi.repository import Gtk, Gdk

builder = Gtk.Builder()
builder.add_from_file("assets/ui/design.glade")

class UI():
    def __init__(self):
        #get window
        self.window = builder.get_object("main_win")
        #add drop target
        self.window.drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.COPY)
        self.window.drag_dest_add_uri_targets()
        self.window.set_title("Main Window")
        #show the window
        self.window.show_all()

#get an instance of the gui specific code
ui = UI()

class Worker():
    """
    Real worker code
    """

#get a worker instance
worker = Worker()

def log(uri):
    status = builder.get_object("status_bar")
    context = status.get_context_id('')
    status.pop(context)
    status.Push(context, uri.rstrip())

class Handler():
    """
    Gtk callback handlers
    """
    def on_main_win_delete_event(self, *args, **kwds):
        Gtk.main_quit()
    def on_main_win_drag_data_received(self, widget, drag_context, x, y, data, info, time):
        log(data.get_data())

#connect handlers
builder.connect_signals(Handler())

if __name__ == '__main__':
    Gtk.main()

テスト済みで機能的。

1
RobotHumans