1

作業中の GUI に問題があります。アイデアは、シグナルのツリー リストを作成し、それらをプロットにドラッグできるようにすることです。最終的にはシグナルや複数のプロットなどの長いリストを持つことになります。ただし、一見乱数のドラッグ アンド ドロップ (場合によっては 1 つだけ) の後、コード セグメンテーションが失敗します。毎回同じ曲線をプロットし、選択できる「信号」は 1 つだけになるように、コードを最小限に抑えました。この場合は x^2 です。

以下に、必要なパッケージを含むコードを投稿しました。

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[i] = self.b[i]*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()

できるだけ不要なコードを削除しようとしました。どんな助けでも大歓迎です!

乾杯!

4

0 に答える 0