在绘制单独的matlibplot数字时,如何让我的面板在wxpython中保持活动状态

时间:2014-04-27 21:02:50

标签: python wxpython

亲爱的Python程序员,

我刚刚开始使用wxpython,我认为这是一个非常酷的工具。我的问题相对简单。我试图使用来自wx.panel窗口的matlibplot plot函数绘制图形(我称之为“Plot”的按钮)。当我按下“Plot”时,它应该打开一个新窗口并在里面绘图。这是正确的,但我的原始面板突然不活动,我无法按或看到任何按钮。但是,当我关闭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()

1 个答案:

答案 0 :(得分:0)

你的matplotlib可能正在使用除wxPython之外的GUI后端,所以无论它使用什么,都会有自己与MainLoop()调用相同的内容。这意味着在关闭绘图窗口之前控件不会返回到wx MainLoop,因此不能调用任何wx事件处理程序。

要解决这个问题,你可以告诉matplotlib使用它的" wxagg"后端而不是默认的任何东西。像这样:

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