在绘制单独的matlibplot图形时,如何在wxpython中保持面板活动

2024-06-25 05:48:27 发布

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

亲爱的Python程序员们:

我刚刚开始使用wxpython,我认为它是一个相当酷的工具。我的问题相对简单。我尝试使用matlibplot plot函数来绘制图形wx.面板窗口(我称之为“绘图”的按钮)。当我按“绘图”时,它应该会打开一个新窗口,并在里面进行绘图。它是正确的,但是我原来的面板突然变得不活动了,我无法按下或看到任何按钮。但是,当我关闭matlibplot窗口时,我的面板再次变为活动状态,我可以创建另一个图形,但这不是我想要的方式。我希望保持所有之前的图形窗口打开并关闭它们,前提是我愿意。在

下面的代码看起来很长,但非常简单:您可以绘制多项式函数或exp函数。图形采用matlibplot Python样式。你可以试着运行它,看看我对非活动窗口是什么意思。在

有人知道我如何让主面板一直处于活动状态,只需绘制图形吗?在

干杯快乐的人:-)

import wx
import numpy as np
import matplotlib.pyplot as plt 

class ExamplePanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        # the combobox Control
        self.mytext = wx.StaticText(self, label="", pos=(20,50))
        self.mytext.SetForegroundColour(wx.BLUE)
        self.funcs = ["y=2x^2+3","y=exp(2x+3)"]
        self.sampleList = ['polynomial', 'exponential']
        self.lblhear = wx.StaticText(self, label="Function", pos=(20,20))
        self.edithear = wx.ComboBox(self, pos=(100, 20), size=(95, -1), choices=self.sampleList, style=wx.CB_DROPDOWN)
        self.edithear.Bind(wx.EVT_COMBOBOX, self.EvtComboBox)

        # A button
        self.button1 = wx.Button(self, label="Plot", pos=(20,80))
        self.button1.Bind(wx.EVT_BUTTON, self.OnClick1)

    def EvtComboBox(self, event): 
        self.data = np.linspace(0,10,100)
        if event.GetString() == self.sampleList[0]:
            self.mytext.SetLabel(self.funcs[0])
            self.yfun=2*self.data**2+3
        elif event.GetString() == self.sampleList[1]:
            self.mytext.SetLabel(self.funcs[1])
            self.yfun=np.exp(2*self.data+3)
        else: 
            return()
        return(self.yfun)

    def OnClick1(self, event):
        plt.figure(1, figsize=(7,5))
        plt.plot(self.data, self.yfun, 'b-')
        plt.tick_params(axis="both", labelsize=15)
        plt.xlabel(r'$x$', fontsize=15)
        plt.ylabel(r'$y$', fontsize=15)
        plt.show()

app = wx.App(redirect=True)
frame = wx.Frame(None, title="A Simple Plotter", pos=(0, 45), size=(280,120))
ExamplePanel(frame)
frame.Show()
app.MainLoop()

Tags: 函数posselfevent图形面板绘图data
2条回答

matplotlib可能正在使用wxPython之外的GUI后端,因此无论它使用什么,它都将有自己的等价于MainLoop()调用。这意味着,在绘图窗口关闭之前,控件不会返回到wx主循环,因此不能调用任何wx事件处理程序。在

要解决这个问题,您可以告诉matplotlib使用它的“wxagg”后端,而不是它的默认值。像这样:

import wx
import matplotlib
matplotlib.use('wxagg')

相关问题 更多 >