【发布时间】:2017-11-14 11:02:32
【问题描述】:
我正在创建一个 GUI,我需要将不同的文件拖放到不同的 wxFilePicker 控件中。 基于此示例wxPython: Dragging a file into window to get file path 我能够将文件路径从一个文件获取到一个文件选择器或所有文件选择器的相同文件路径:
def updateText(self, text):
"""
Write text to the wx control
"""
self.m_filePicker1.SetPath(text)
self.m_filePicker2.SetPath(text)
self.m_filePicker3.SetPath(text)
尽管它按预期工作,但该解决方案没有用。
我需要为每个 wxfilepicker 控件创建不同的面板还是有其他方法可以解决这个问题?
提前谢谢你
伊沃
这是代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import division
import wx
import wx.xrc
########################################################################
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 Test_Panel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 164),
style=wx.TAB_TRAVERSAL)
bSizer122 = wx.BoxSizer(wx.VERTICAL)
sbSizer2 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"Model"), wx.VERTICAL)
bSizer3 = wx.BoxSizer(wx.VERTICAL)
bSizer4 = wx.BoxSizer(wx.VERTICAL)
bSizer10 = wx.BoxSizer(wx.HORIZONTAL)
bSizer12 = wx.BoxSizer(wx.VERTICAL)
self.m_staticText1 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"Model File", wx.DefaultPosition,
wx.Size(100, -1), wx.ALIGN_CENTRE)
self.m_staticText1.Wrap(-1)
bSizer12.Add(self.m_staticText1, 1, wx.ALL | wx.EXPAND, 5)
bSizer10.Add(bSizer12, 0, wx.ALIGN_CENTER_VERTICAL, 5)
bSizer13 = wx.BoxSizer(wx.VERTICAL)
self.m_filePicker1 = wx.FilePickerCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, u"Select a file",
u"*.*", wx.DefaultPosition, wx.DefaultSize, wx.FLP_DEFAULT_STYLE)
bSizer13.Add(self.m_filePicker1, 1, wx.ALL | wx.EXPAND, 5)
bSizer10.Add(bSizer13, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
bSizer4.Add(bSizer10, 0, wx.EXPAND, 5)
bSizer11 = wx.BoxSizer(wx.HORIZONTAL)
bSizer14 = wx.BoxSizer(wx.VERTICAL)
self.m_staticText2 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"Data File", wx.DefaultPosition,
wx.Size(100, -1), wx.ALIGN_CENTRE)
self.m_staticText2.Wrap(-1)
bSizer14.Add(self.m_staticText2, 1, wx.ALL, 5)
bSizer11.Add(bSizer14, 0, wx.ALIGN_CENTER_VERTICAL, 5)
bSizer15 = wx.BoxSizer(wx.VERTICAL)
self.m_filePicker2 = wx.FilePickerCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, u"Select a file",
u"*.*", wx.DefaultPosition, wx.DefaultSize, wx.FLP_DEFAULT_STYLE)
bSizer15.Add(self.m_filePicker2, 0, wx.ALL | wx.EXPAND, 5)
bSizer11.Add(bSizer15, 1, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL, 5)
bSizer4.Add(bSizer11, 1, wx.EXPAND, 5)
bSizer111 = wx.BoxSizer(wx.HORIZONTAL)
bSizer141 = wx.BoxSizer(wx.VERTICAL)
self.m_staticText21 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"DoF Labels", wx.DefaultPosition,
wx.Size(100, -1), wx.ALIGN_CENTRE)
self.m_staticText21.Wrap(-1)
bSizer141.Add(self.m_staticText21, 1, wx.ALL | wx.EXPAND, 5)
bSizer111.Add(bSizer141, 0, wx.ALIGN_CENTER_VERTICAL, 5)
bSizer151 = wx.BoxSizer(wx.VERTICAL)
file_drop_target = MyFileDropTarget(self)
self.m_filePicker3 = wx.FilePickerCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, u"Select a file",
u"*.*", wx.DefaultPosition, wx.DefaultSize, wx.FLP_DEFAULT_STYLE)
bSizer151.Add(self.m_filePicker3, 0, wx.ALL | wx.EXPAND, 5)
bSizer111.Add(bSizer151, 1, wx.EXPAND, 5)
bSizer4.Add(bSizer111, 0, wx.EXPAND, 5)
bSizer3.Add(bSizer4, 0, wx.EXPAND, 5)
sbSizer2.Add(bSizer3, 1, wx.EXPAND, 5)
bSizer122.Add(sbSizer2, 0, wx.ALL | wx.EXPAND, 5)
self.SetSizer(bSizer122)
self.Layout()
self.m_filePicker1.SetDropTarget(file_drop_target)
def updateText(self, text):
"""
Write text to the wx control
"""
self.m_filePicker1.SetPath(text)
def __del__(self):
pass
class Test_Frame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=wx.DefaultPosition,
size=wx.Size(500, 300), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
bSizer239 = wx.BoxSizer(wx.VERTICAL)
self.m_panel8 = Test_Panel(self)#, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
#self.m_panel8 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
bSizer239.Add(self.m_panel8, 1, wx.EXPAND
, 5)
self.SetSizer(bSizer239)
self.Layout()
self.Centre(wx.BOTH)
def __del__(self):
pass
if __name__ == "__main__":
app = wx.App(redirect=False)
frame = Test_Frame(None)
app.SetTopWindow(frame)
frame.Show(True)
app.MainLoop()
【问题讨论】:
-
我认为您最好使用几个 TreeCtrls 或其他类似树的小部件之一。它们支持拖放比使用文件选择器小部件更容易。
标签: python user-interface drag-and-drop wxpython