You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:11:03