wxPython:将文件拖入窗口以获取文件路径
问题描述
我想将文件拖到窗口中并获取文件路径.我试过这样做:
I want to drag a file into a window and get the file path. I've tried doing this:
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 教程代码,但它也没有做任何事情.我该如何做到这一点?
But this does nothing. I've tried running this tutorial code, but it doesn't do anything either. How do I accomplish this?
解决方案
当你打印 self.data
时,你应该会看到打印出来的路径列表.无论如何,我写了一个 教程 前一阵子拖放,它显示了如何执行此操作.这是我的代码稍作修改的版本,它既可以将文件路径打印到标准输出,也可以打印到文本控件:
When you print self.data
, you should see a list of paths printed out. Anyway, I wrote up a tutorial on drag-n-drop a while ago which shows how to do this. Here's a slightly modified version of my code that both prints out the file paths to stdout and to a text control too:
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("
%d file(s) dropped at %d,%d:
" %
(len(filenames), x, y))
print filenames
for filepath in filenames:
self.window.updateText(filepath + '
')
########################################################################
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()
相关文章