wxPython:将文件拖入窗口以获取文件路径
Posted
技术标签:
【中文标题】wxPython:将文件拖入窗口以获取文件路径【英文标题】:wxPython: Dragging a file into window to get file path 【发布时间】:2015-10-02 04:43:27 【问题描述】:我想将文件拖到窗口中并获取文件路径。我试过这样做:
class CSVDropper(wx.FileDropTarget):
def __init__(self, data):
wx.FileDropTarget.__init__(self)
self.data = data
def OnDropFiles(self, x, y, filenames):
self.data = filenames
print self.data
然后在主窗口中:
# Drag & Drop
self.csv_path = None
self.drop_table = CSVDropper(self.csv_path)
self.SetDropTarget(self.drop_table)
但这无济于事。我试过运行this 教程代码,但它也没有做任何事情。我该如何做到这一点?
【问题讨论】:
变量名无关紧要。尽管如此,我还是改变了它们。结果还是一样。 我想我有点天真。我认为 print 会将药物文件的文件路径打印到窗口中。我怀疑这实际上会发生什么。但是,无论打印什么,当我将它拖到窗口上时,我都会得到类似于 no smoking icon 的东西。当我在发布的演示中尝试此操作时,我得到了同样的结果。 哦,self是一个wx.Frame对象。我希望他们能够将其拖放到窗口中。哪里都好。 【参考方案1】:当您打印self.data
时,您应该会看到打印出的路径列表。无论如何,我不久前在拖放上写了一个tutorial,它展示了如何做到这一点。这是我的代码稍作修改的版本,它既可以将文件路径打印到标准输出,也可以打印到文本控件:
import wx
########################################################################
class MyFileDropTarget(wx.FileDropTarget):
""""""
#----------------------------------------------------------------------
def __init__(self, window):
"""Constructor"""
wx.FileDropTarget.__init__(self)
self.window = window
#----------------------------------------------------------------------
def OnDropFiles(self, x, y, filenames):
"""
When files are dropped, write where they were dropped and then
the file paths themselves
"""
self.window.SetInsertionPointEnd()
self.window.updateText("\n%d file(s) dropped at %d,%d:\n" %
(len(filenames), x, y))
print filenames
for filepath in filenames:
self.window.updateText(filepath + '\n')
########################################################################
class DnDPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
file_drop_target = MyFileDropTarget(self)
lbl = wx.StaticText(self, label="Drag some files here:")
self.fileTextCtrl = wx.TextCtrl(self,
style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY)
self.fileTextCtrl.SetDropTarget(file_drop_target)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(lbl, 0, wx.ALL, 5)
sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5)
self.SetSizer(sizer)
#----------------------------------------------------------------------
def SetInsertionPointEnd(self):
"""
Put insertion point at end of text control to prevent overwriting
"""
self.fileTextCtrl.SetInsertionPointEnd()
#----------------------------------------------------------------------
def updateText(self, text):
"""
Write text to the text control
"""
self.fileTextCtrl.WriteText(text)
########################################################################
class DnDFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, parent=None, title="DnD Tutorial")
panel = DnDPanel(self)
self.Show()
#----------------------------------------------------------------------
if __name__ == "__main__":
app = wx.App(False)
frame = DnDFrame()
app.MainLoop()
【讨论】:
我试过运行你的代码,但还是不行。我从 Windows 资源管理器中将一些文件拖到盒子上,然后我得到了一个小圆圈,里面有一条线。我将文件放在窗口上,没有任何反应。我可能做错了什么? 我不知道。您使用的是什么版本的 wxPython 以及在什么操作系统上?我在 Windows 7、Python 2.7.9 和 wxPython 3.0.2.0 上测试了这段代码。我还在 Xubuntu 14.04 上使用 Python 2.7.6 和 wxPython 2.8.12 进行了测试 Windows 7、Python 2.7.9、wxPython 2.8.12.1 我会在同事的电脑上试一试,然后报告。 问题是我正在使用调试模式通过 IDE 运行您提供给我的教程文件。那一定以某种方式阻止了该文件。但是,我的程序仍然无法正常工作。 (object).SetDropTarget 是否有某些限制?不能是 wx.Frame 吗?框架可以在 wx.Notebook 中吗?还是必须是 Control 对象?以上是关于wxPython:将文件拖入窗口以获取文件路径的主要内容,如果未能解决你的问题,请参考以下文章
如何从tree目录获取文件路径以使用wxpython读取文本文件行..?