tkinterdnd2向Gtk3应用拖放文件时get_uris返回空问题
问题:TkinterDnd2拖放文件至Gtk3应用时data.get_uris()返回空列表
将tkinterdnd2中的文件拖入Nautilus等Gtk3应用时无响应,核心问题在于Gtk3应用通过调用data.get_uris()在拖放回调中获取文件列表,但当拖放源为tkinterdnd2时,该方法返回空列表。基础拖放逻辑是正常的,因为Gtk应用可通过data.get_data()获取文件名。需要配置tkinterdnd2拖放源,使Gtk3应用能通过data.get_uris()获取文件列表。
TkinterDnd2拖放源应用
import os import platform from tkinterdnd2 import * from tkinter import * root = TkinterDnD.Tk() root.withdraw() root.title('TkinterDnD File DnD') label = Label(root, text='Drag Me') label.pack(padx=20, pady=20) def drag_init(event): return ((LINK), (DND_FILES), ("/tmp/test.txt")) def drag_end(event): print('Drag ended for widget:', event.widget) label.drag_source_register(1, DND_FILES) label.dnd_bind('<<DragInitCmd>>', drag_init) label.dnd_bind('<<DragEndCmd>>', drag_end) root.update_idletasks() root.deiconify() root.mainloop()
GTK3拖放接收应用
import gi gi.require_version("Gdk", "3.0") gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk window = Gtk.Window() window.connect("delete-event", Gtk.main_quit) box = Gtk.HBox() window.add(box) def on_drag_data_received(widget, drag_context, x, y, data, info, time): print("Received uris: {}".format(data.get_uris())) ### 返回空列表 print("Received data: {}".format(data.get_data())) ### 获取到拖放文件路径 drop_button = Gtk.Button(label="Drop") drop_button.drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.LINK) drop_button.drag_dest_add_uri_targets() drop_button.connect("drag-data-received", on_drag_data_received) box.add(drop_button) window.show_all() Gtk.main()
测试现象:将测试文件从tkinterdnd2应用拖入Gtk应用后,Gtk应用的标准输出显示:data.get_data()可获取文件路径,但data.get_uris()返回空列表。
内容的提问来源于stack exchange,提问作者Eric Gilbertson
相关产品推荐
相关产品推荐

