wx中不同弹出选项的不同MatlibPlot

2024-06-07 10:54:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为带有wx的信号发生器制作一个简单的gui。当选择“正弦”选项时,我想显示一个小的正弦波图,当从菜单中选择“方形”时,我想显示一个方波图。我是python的新手,因此这些类和继承对我来说很困难

在(更精简的)代码中,“ServelPanel”类中有一个变量“wave”,用于保存所选的wavetype。然而,当我尝试在MainFrame类中绘制波形时,我一生都无法检索“wave”变量。我试图继承类,将“wave”变量设置为全局变量,但我已经没有主意了

import wx, random, math, os
from pyo import *

from numpy import arange, sin, pi, sign
import matplotlib
matplotlib.use('WXAgg')

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as 
FigureCanvas
from matplotlib.backends.backend_wx import NavigationToolbar2Wx
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class BasePanel(wx.Panel):
    def __init__(self, parent, title):
        wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER)
        self.SetMaxSize((230,150))
        self.sliders = []
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.titleSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.close = wx.StaticText(self, id=-1, label="X")
        self.close.Bind(wx.EVT_LEFT_DOWN, self.MouseDown)
        self.titleSizer.Add(self.close, 0, wx.LEFT, 5)
        self.title = wx.StaticText(self, id=-1, label=title)
        off = (210 - self.title.GetSize()[0]) / 2
        self.titleSizer.Add(self.title, 0, wx.LEFT, off)
        self.sizer.Add(self.titleSizer, 0, wx.BOTTOM|wx.TOP, 4)

class ServerPanel(wx.Panel):
    def __init__(self, parent, colour="#DDDDE7"):
        wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER)
        self.SetBackgroundColour(colour)
        self.SetMinSize((230,250))
        self.fileformat = self.wavetype = 0
        self.title = wx.StaticText(self, id=-1, label="--- Simple Wave 
Generator ---", pos=(40,5))
        font, psize = self.title.GetFont(), 
        self.title.GetFont().GetPointSize()
        font.SetPointSize(psize-2)
        self.waveText = 
        wx.StaticText(self,id=-1,label="Waveform",pos(15,60))
        self.popupWave = wx.Choice(self, id=wx.ID_ANY, pos=(13,70), 
        size(70,20), choices=["Sine","Square"])
        self.popupWave.Bind(wx.EVT_CHOICE, self.changeWave)

        objs = [self.waveText]
        for obj in objs:
            obj.SetFont(font)

     def changeWave(self, evt):
        global wave
        wave = evt.GetInt()
        if wave == 1: wave = 2
        self.wavetype = wave

class MainFrame(wx.Frame,ServerPanel):
    def __init__(self, parent=None, title=u"Sine Test", size=(250,300)):
        wx.Frame.__init__(self, parent, id=-1, title=title, size=size)
        self.server = Server().boot()
        self.sizer = wx.FlexGridSizer(4,4,0,0)        
        self.panel = wx.Panel(self)
        self.serverPanel = ServerPanel(self.panel)
        self.sizer.Add(self.serverPanel)        
        self.panel.SetSizer(self.sizer)
        pan = CanvasPanel(self.panel)
        pan.draw()
        self.Show()

class CanvasPanel(wx.Panel):
        def __init__(self, parent):
        wx.Panel.__init__(self, parent, id=-1, pos=wx.Point(100,60), 
        size=wx.Size(80, 50))
        figsize = (80*1.0/80, 50*1.0/80)
        self.figure = Figure(figsize, dpi=80)
        self.axes = self.figure.add_subplot(111)
        self.axes.set_axis_off()
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas,1,wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

    def draw(self):
        t = arange(0.0, 3.0, 0.01)
        s = sin(2 * pi * t)
        self.axes.plot(t, s)

    def drawSqr(self):
        t = arange(0.0, 3.0, 0.01)
        s = sign(sin(2 * pi * t))
        self.axes.plot(t, s)

mainFrame = MainFrame()
app.MainLoop()

Ps:我知道“最小工作示例”并不是真的最小,但这是我目前可以得到的工作。请原谅一个新手

在这个示例中,我硬编码了一个要在MainFrame类中显示的图形,因此您可以看到该图形应该在哪里

enter image description here


Tags: fromimportselfaddidsizetitlematplotlib
1条回答
网友
1楼 · 发布于 2024-06-07 10:54:45

如果我们稍微精简一下代码,删除不需要的类,使用sizers而不是混合大小调整器和位置语句,清理缩进问题,删除未声明的项和未使用的导入。
我们从这些方面得到了一些东西

import wx
from numpy import arange, sin, pi, sign
import matplotlib
matplotlib.use('WXAgg')

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure

class MainFrame(wx.Frame):
    def __init__(self, parent=None, title=u"Sine Test", size=(250,300)):
        wx.Frame.__init__(self, parent, id=-1, title=title, size=size)
        self.panel = wx.Panel(self,-1,style=wx.SUNKEN_BORDER)
        self.panel.SetBackgroundColour("#DDDDE7")
        self.panel.SetMinSize((230,250))
        self.wavetype = 0
        self.title = wx.StaticText(self.panel, id=-1, label=" - Simple Wave Generator  -")
        font, psize = self.title.GetFont(), self.title.GetFont().GetPointSize()
        font.SetPointSize(psize-2)
        self.waveText = wx.StaticText(self.panel,id=-1,label="Waveform")
        self.popupWave = wx.Choice(self.panel, id=wx.ID_ANY, size=(70,30), choices=["Sine","Square"])
        self.popupWave.Bind(wx.EVT_CHOICE, self.changeWave)
        self.pan = CanvasPanel(self)

        self.sizer =  wx.GridBagSizer(hgap=5,vgap=5)
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.title, pos=(0,0), span=(1,4), flag = wx.ALL|wx.ALIGN_CENTER)
        self.sizer.Add(self.waveText, pos=(2,0), flag = wx.ALL)
        self.sizer.Add(self.popupWave, pos=(3,0), flag = wx.ALL)
        self.sizer.Add(self.pan, pos=(3,1), span=(3,3), flag = wx.ALL|wx.EXPAND)
        self.panel.SetSizer(self.sizer)
        self.main_sizer.Add(self.panel,1,wx.EXPAND)
        self.SetSizer(self.main_sizer)

        self.popupWave.SetSelection(0)
        self.pan.wavetype = self.popupWave.GetSelection()
        self.pan.draw()
        self.Show()

    def changeWave(self, evt):
        wave = evt.GetSelection()
        self.pan.wavetype = wave
        self.pan.draw()


class CanvasPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, id=-1, size=wx.Size(80, 50))
        figsize = (80*1.0/80, 50*1.0/80)
        self.figure = Figure(figsize, dpi=80)
        self.wavetype = parent.wavetype
        self.axes = self.figure.add_subplot(111)
        self.axes.set_axis_off()
        self.canvas = FigureCanvas(self, -1, self.figure)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas,1,wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()

    def draw(self):
        #Clear any previous data
        self.axes.clear()
        self.axes.set_axis_off()
        #Plot new wave
        if self.wavetype == 0:
            t = arange(0.0, 3.0, 0.01)
            s = sin(2 * pi * t)
            self.axes.plot(t, s)
        else:
            t = arange(0.0, 3.0, 0.01)
            s = sign(sin(2 * pi * t))
            self.axes.plot(t, s)
        self.Layout()

app=wx.App()
mainFrame = MainFrame()
app.MainLoop()

enter image description hereenter image description here

它可能不完全是你想要的,所以请随意玩它

相关问题 更多 >

    热门问题