2017-11-14 1 views
0

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() 
+0

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. –

Antwort

0

Hier ist meine Lösung für das Problem ist:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

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') 
      self.window.updateText(filepath) 

class Model_Data(wx.Panel): 
    def __init__(self, parent, label): 
     wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(-1, -1), 
          style=wx.TAB_TRAVERSAL) 

     bSizer122 = wx.BoxSizer(wx.VERTICAL) 

     bSizer3 = wx.BoxSizer(wx.VERTICAL) 

     bSizer10 = wx.BoxSizer(wx.HORIZONTAL) 

     bSizer12 = wx.BoxSizer(wx.VERTICAL) 

     self.m_staticText1 = wx.StaticText(self, wx.ID_ANY, label, wx.DefaultPosition, wx.Size(100, -1), 
     #self.m_staticText1 = wx.StaticText(self, 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(self, 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) 

     ############################################## 
     file_drop_target = MyFileDropTarget(self) 
     self.m_filePicker1.SetDropTarget(file_drop_target) 
     ############################################## 

     bSizer3.Add(bSizer10, 0, wx.EXPAND, 5) 

     bSizer122.Add(bSizer3, 0, wx.EXPAND, 5) 

     self.SetSizer(bSizer122) 
     self.Layout() 

    def updateText(self, text): 
     """ 
     Write text to the wx control 
     """ 
     self.m_filePicker1.SetPath(text) 

    def __del__(self): 
     pass 


class Generic_Panel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(-1, -1), 
          style=wx.TAB_TRAVERSAL) 

     bSizer122 = wx.BoxSizer(wx.VERTICAL) 

     bSizer3 = wx.BoxSizer(wx.VERTICAL) 

     bSizer10 = wx.BoxSizer(wx.HORIZONTAL) 

     bSizer12 = wx.BoxSizer(wx.VERTICAL) 

     self.m_staticText1 = wx.StaticText(self, 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(self, 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, 5) 

     bSizer10.Add(bSizer13, 0, wx.ALIGN_CENTER_VERTICAL, 5) 

     bSizer3.Add(bSizer10, 1, wx.EXPAND, 5) 

     bSizer122.Add(bSizer3, 1, wx.EXPAND, 5) 

     self.SetSizer(bSizer122) 
     self.Layout() 
     bSizer122.Fit(self) 

    def __del__(self): 
     pass 


class 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.SetBackgroundColour('LightGrey') 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer239 = wx.BoxSizer(wx.VERTICAL) 

     sbSizer8 = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"Model "), wx.VERTICAL) 

     self.m_panel1 = Model_Data(sbSizer8.GetStaticBox(),'Model File') 

     sbSizer8.Add(self.m_panel1, 0, wx.EXPAND | wx.ALL, 5) 

     self.m_panel2 = Model_Data(sbSizer8.GetStaticBox(),'Model Data') 
     sbSizer8.Add(self.m_panel2, 0, wx.ALL | wx.EXPAND, 5) 

     self.m_panel3 = Model_Data(sbSizer8.GetStaticBox(),'DoF Labels') 
      # wx.Panel(sbSizer8.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 
      #      wx.TAB_TRAVERSAL) 

     sbSizer8.Add(self.m_panel3, 0, wx.EXPAND | wx.ALL, 5) 

     bSizer239.Add(sbSizer8, 1, wx.ALL | 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 = Frame(None) 
    app.SetTopWindow(frame) 
    frame.Show(True) 
    app.MainLoop() 
Verwandte Themen