将文件拖放到 Python GUI (GTK)
Drop file in Python GUI (GTK)
我想写一个小应用程序来获取选定数量的文件,并存储所有内容的路径以备将来使用。
基本上:
Select 来自 Nautilus(在本例中)的混合(图像、音频、视频)文件,将它们拖放到此 GUI 中,并获取要写入列表中的每个元素的绝对路径,对于例如。
程序本身根本不是问题,但我在最简单的任务中失败了,也许:创建一个 GUI(我选择了 GTK,但一切都会好起来的,只需要完成工作)谁接受元素并存储它们。
我正在玩 Glade,但我什至不确定这是否是正确的选择。
有人可以帮助我构建此 GUI 或指出一些资源吗?
这是开始使用 Glade、Gtk 和 Python 的好方法:
http://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html
然后拖放:
http://python-gtk-3-tutorial.readthedocs.io/en/latest/drag_and_drop.html
使用小程序编辑:
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import os, sys
class GUI:
def __init__(self):
window = Gtk.Window()
window.connect('destroy', Gtk.main_quit)
textview = Gtk.TextView()
enforce_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(4), 129)
textview.drag_dest_set(Gtk.DestDefaults.ALL, [enforce_target], Gdk.DragAction.COPY)
textview.connect("drag-data-received", self.on_drag_data_received)
#textview.drag_dest_set_target_list([enforce_target])
window.add(textview)
window.show_all()
def on_drag_data_received(self, widget, drag_context, x,y, data,info, time):
print (data.get_text())
def main():
app = GUI()
Gtk.main()
if __name__ == "__main__":
sys.exit(main())
我已经尝试了 @theGtknerd 提供的示例,但无济于事。经过几个小时的调试,我得到了这个例子,只有几行。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import sys
class GUI:
def __init__(self):
window = Gtk.Window()
window.connect('destroy', Gtk.main_quit)
textview = Gtk.TextView()
# (drag behaviour, targets (leave empty), action)
textview.drag_dest_set(Gtk.DestDefaults.DROP, [], Gdk.DragAction.COPY)
# add the ability to receive URIs (e.g. file paths)
textview.drag_dest_add_uri_targets()
textview.connect("drag-data-received", self.on_drag_data_received)
window.add(textview)
window.show_all()
def on_drag_data_received(self, widget, drag_context, x,y, data,info, time):
print(data.get_uris())
# (context, success, delete_from_source, time)
Gtk.drag_finish(drag_context, True, False, time)
# always call Gtk.drag_finish to receive as suggested by documentation
def main():
GUI()
Gtk.main()
if __name__ == "__main__":
sys.exit(main())
自己的观察:
- 任何 Gtk.Widget 都可以启用
.drag_dest_set()
接收数据,但需要在此处设置目标或调用添加它们的方法,例如 .drag_dest_add_uri_targets()
.
- Gtk.TextView 似乎有一个错误,其中信号
drag-data-received
在第一次调用后重复两次,因此处理程序被调用两次。在这对调用中,第一个包含新数据,第二个包含以前的数据。
我想写一个小应用程序来获取选定数量的文件,并存储所有内容的路径以备将来使用。
基本上:
Select 来自 Nautilus(在本例中)的混合(图像、音频、视频)文件,将它们拖放到此 GUI 中,并获取要写入列表中的每个元素的绝对路径,对于例如。
程序本身根本不是问题,但我在最简单的任务中失败了,也许:创建一个 GUI(我选择了 GTK,但一切都会好起来的,只需要完成工作)谁接受元素并存储它们。
我正在玩 Glade,但我什至不确定这是否是正确的选择。
有人可以帮助我构建此 GUI 或指出一些资源吗?
这是开始使用 Glade、Gtk 和 Python 的好方法:
http://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html
然后拖放:
http://python-gtk-3-tutorial.readthedocs.io/en/latest/drag_and_drop.html
使用小程序编辑:
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import os, sys
class GUI:
def __init__(self):
window = Gtk.Window()
window.connect('destroy', Gtk.main_quit)
textview = Gtk.TextView()
enforce_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(4), 129)
textview.drag_dest_set(Gtk.DestDefaults.ALL, [enforce_target], Gdk.DragAction.COPY)
textview.connect("drag-data-received", self.on_drag_data_received)
#textview.drag_dest_set_target_list([enforce_target])
window.add(textview)
window.show_all()
def on_drag_data_received(self, widget, drag_context, x,y, data,info, time):
print (data.get_text())
def main():
app = GUI()
Gtk.main()
if __name__ == "__main__":
sys.exit(main())
我已经尝试了 @theGtknerd 提供的示例,但无济于事。经过几个小时的调试,我得到了这个例子,只有几行。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import sys
class GUI:
def __init__(self):
window = Gtk.Window()
window.connect('destroy', Gtk.main_quit)
textview = Gtk.TextView()
# (drag behaviour, targets (leave empty), action)
textview.drag_dest_set(Gtk.DestDefaults.DROP, [], Gdk.DragAction.COPY)
# add the ability to receive URIs (e.g. file paths)
textview.drag_dest_add_uri_targets()
textview.connect("drag-data-received", self.on_drag_data_received)
window.add(textview)
window.show_all()
def on_drag_data_received(self, widget, drag_context, x,y, data,info, time):
print(data.get_uris())
# (context, success, delete_from_source, time)
Gtk.drag_finish(drag_context, True, False, time)
# always call Gtk.drag_finish to receive as suggested by documentation
def main():
GUI()
Gtk.main()
if __name__ == "__main__":
sys.exit(main())
自己的观察:
- 任何 Gtk.Widget 都可以启用
.drag_dest_set()
接收数据,但需要在此处设置目标或调用添加它们的方法,例如.drag_dest_add_uri_targets()
. - Gtk.TextView 似乎有一个错误,其中信号
drag-data-received
在第一次调用后重复两次,因此处理程序被调用两次。在这对调用中,第一个包含新数据,第二个包含以前的数据。