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读取文本文件行..?

Python - 将文件拖入 .exe 以运行脚本

将文件拖入 cocoa OSX 中的其他应用程序

将文件拖入 QtGui.QLineEdit() 以设置 url 文本

分享一个bat文件代码:在图片中隐藏rar压缩文件

Mac 日常使用问题收集