Ich erstelle eine GUI, wo ich verschiedene Dateien in verschiedene wxFilePicker Steuerelemente ziehen und ablegen muss. Basierend auf diesem Beispiel wxPython: Dragging a file into window to get file path konnte ich die Filepath von einer Datei in eine Filepicker oder gleichen filepath für alle filepickers erhalten mit:Drag & Drop-Dateien zu verschiedenen WxFilePicker-Steuerelementen
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)
Obwohl es, wie es funktionierte diese Lösung zu erwarten wäre es nicht sinnvoll.
Muss ich für jedes wxfilepicker-Steuerelement verschiedene Bedienfelder erstellen oder gibt es eine andere Möglichkeit, dieses Problem zu lösen?
Vielen Dank im Voraus
Ivo
Hier ist der Code
#!/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()
Ich glaube, Sie besser mit ein paar wäre von TreeCtrls oder eines der anderen baumähnlichen Widgets. Sie unterstützen das Ziehen und Ablegen ein wenig einfacher und verwenden dann die Dateiauswahl-Widgets. –