[Python] Python GUI Drag/Drop Problems

Discussão em 'Python' iniciado por Stack, Fevereiro 7, 2025.

  1. Stack

    Stack Membro Participativo

    I am having problems with a GUI I'm working on. The idea is to have a tree list of signals and be able to drag them onto the plot. Eventually having a long list of signals and multiple plots etc.. However the code segmentation faults after a seemingly random number of drag & drops (sometimes just one). I've stripped the code to the bare bones so it plots the same curve each time and there is only one 'signal'to choose from; in this case just x^2.

    Below I've posted the code with the packages it requires.

    import wx
    import random
    import scipy
    import matplotlib
    matplotlib.use('WXAgg')
    from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
    from matplotlib.figure import Figure

    class MainFrame(wx.Frame):
    ''' Create the mainframe on which all of the other panels are placed.
    '''
    def __init__(self):
    wx.Frame.__init__(self, parent=None, title="GUI", size=(998,800))
    self.SetBackgroundColour('#CCCCCC')
    self.GUIBox = wx.BoxSizer(wx.HORIZONTAL)
    self.P = PlotWindow(self)
    self.DD = DragDrop(self)
    self.GUIBox.Add(self.DD, 0, wx.LEFT | wx.ALIGN_TOP)
    self.GUIBox.Add(self.P, 0, wx.LEFT | wx.ALIGN_TOP)
    self.SetSizer(self.GUIBox)
    return

    class PlotWindow(wx.Panel):
    def __init__(self, parent):
    wx.Window.__init__(self, parent)
    self.Figure = Figure()
    self.Figure.set_size_inches(8.56, 9.115)
    self.C = FigureCanvasWxAgg(self, -1, self.Figure)
    self.SP = self.Figure.add_subplot(111)
    self.a = [0,1,2,3,4,5]
    self.b = [0,1,4,9,16,25]
    self.signals = [self.b]

    def rePlot(self):
    self.SP.clear()
    c = scipy.zeros(6)
    for i in range(0, 6, 1):
    c = self.b*random.uniform(0, 2)
    self.SP.plot(self.a,c)
    self.C.draw()

    class MyTextDropTarget(wx.TextDropTarget):

    def __init__(self, objt):
    wx.TextDropTarget.__init__(self)
    self.Objt = objt

    def OnDropText(self, x, y, data):
    self.Objt.rePlot()

    class DragDrop(wx.Panel):

    def __init__(self, parent):
    wx.Panel.__init__(self, parent, style=wx.BORDER_RAISED)
    self.SetBackgroundColour('#CCCCCC')
    self.tree = wx.TreeCtrl(self, -1, size=(270,700))

    # Add root
    root = self.tree.AddRoot("Signals")
    self.tree.AppendItem(root, "Square")

    dt = MyTextDropTarget(self.GetParent().P)
    self.GetParent().P.SetDropTarget(dt)
    self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnDragInit)

    self.VBox = wx.BoxSizer(wx.VERTICAL)
    self.VBox.Add(self.tree, 0)
    self.SetSizer(self.VBox)

    def OnDragInit(self, event):
    text = self.tree.GetItemText(event.GetItem())
    tdo = wx.TextDataObject(text)
    tds = wx.DropSource(self.tree)
    tds.SetData(tdo)
    tds.DoDragDrop(True)

    class App(wx.App):
    def OnInit(self):
    self.dis = MainFrame()
    self.dis.Show()
    return True

    app = App()
    app.MainLoop()


    I've tried to take out as much unnecessary code as possible; any help would be much appreciated!

    Cheers!

    Continue reading...

Compartilhe esta Página