2010-03-14 12 views
11

मैं समझ नहीं पा रहा हूं कि FigCanvasWxAgg उदाहरण को रीफ्रेश कैसे करें।matplotlib: figure.canvas को रीफ्रेश करने के लिए कैसे करें


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

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.NewId(), "Main") 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 

     self.figure = Figure(figsize=(1,2)) 
     self.axe = self.figure.add_subplot(111) 
     self.figurecanvas = FigureCanvas(self, -1, self.figure) 

     self.buttonPlot = wx.Button(self, wx.NewId(), "Plot") 
     self.buttonClear = wx.Button(self, wx.NewId(), "Clear") 

     self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND) 
     self.sizer.Add(self.buttonPlot, proportion=0, border=2, flag=wx.ALL) 
     self.sizer.Add(self.buttonClear, proportion=0, border=2, flag=wx.ALL) 
     self.SetSizer(self.sizer) 

     self.figurecanvas.Bind(wx.EVT_LEFT_DCLICK, self.on_dclick) 
     self.buttonPlot.Bind(wx.EVT_BUTTON, self.on_button_plot) 
     self.buttonClear.Bind(wx.EVT_BUTTON, self.on_button_clear) 

     self.subframe_opened = False 

    def on_dclick(self, evt): 
     self.subframe = SubFrame(self, self.figure) 
     self.subframe.Show(True) 
     self.subframe_opened = True 

    def on_button_plot(self, evt): 
     self.axe.plot(range(10), color='green') 
     self.figurecanvas.draw() 

    def on_button_clear(self, evt): 
     if self.subframe_opened: 
      self.subframe.Close() 
     self.figure.set_canvas(self.figurecanvas) 
     self.axe.clear() 
     self.figurecanvas.draw() 


class SubFrame(wx.Frame): 
    def __init__(self, parent, figure): 
     wx.Frame.__init__(self, parent, wx.NewId(), "Sub") 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.figurecanvas = FigureCanvas(self, -1, figure) 
     self.sizer.Add(self.figurecanvas, proportion=1, border=5, flag=wx.ALL | wx.EXPAND) 
     self.SetSizer(self.sizer) 

     self.Bind(wx.EVT_CLOSE, self.on_close) 

    def on_close(self, evt): 
     self.GetParent().subframe_opened = False 
     evt.Skip() 



class MyApp(wx.App): 
    def OnInit(self): 
     frame = MainFrame() 
     frame.Show(True) 
     self.SetTopWindow(frame) 
     return True 

app = MyApp(0) 
app.MainLoop()  

मैं आपरेशन के निम्न क्रम में दिलचस्पी रखता हूँ:

  • रन एक स्क्रिप्ट
  • मुख्य फ़्रेम का आकार बदलने
  • प्रेस प्लॉट बटन
  • डबल क्लिक करें यहाँ उदाहरण है साजिश पर
  • साफ़ करें बटन

अब मुझे मुख्य फ्रेम प्लॉट पर गड़बड़ है। अगर मैं फ्रेम का आकार बदलता हूं तो यह ठीक से ठीक हो जाता है। मेरा सवाल यह है कि मैं अपने कोड में आकार बदलने के बिना क्या करना चाहिए?

http://img227.imageshack.us/img227/5407/mess.png

अग्रिम धन्यवाद:

एक "गंदगी" मैं कुछ इस तरह मतलब है।

+0

@ एलेक्स, मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं, "गड़बड़" से आपका क्या मतलब है? मैंने आपके कोड की कोशिश की और मुझे कोई समस्या नहीं दिखाई दे रही है। मुख्य फ्रेम ठीक आकार बदलता है, बटन साजिश खींचता है, डबल-क्लिक एक नया फ्रेम बनाता है जो एक ही आकृति कैनवास को मुख्य के रूप में दिखाता है, स्पष्ट बटन साजिश को साफ़ करता है और उप-फ्रेम को बंद करता है। – Mark

+0

हम्म .. यह अजीब है, मैंने स्पष्ट के बाद राज्य के साथ तस्वीर जोड़ा। – Alex

+0

मैंने मूल रूप से लिनक्स पर कोशिश की, विंडोज़ के तहत मैं आपकी तस्वीर को पुन: उत्पन्न कर सकता हूं। ऐसा इसलिए है क्योंकि आप अपनी आकृति वस्तु को दो wxFrames (शायद एक अच्छा विचार नहीं) के बीच साझा कर रहे हैं। अगर कोई मुझे इससे दांव नहीं देता है, तो मैं इस शाम को नज़दीकी रूप से देखूंगा। – Mark

उत्तर

11

जैसा कि मैंने टिप्पणियों में कहा था, मुझे नहीं लगता कि यह आंकड़ा कैनवास रीफ्रेश आपकी समस्या है, असल में मुझे लगता है कि यह वही कर रहा है जो इसे माना जाता है (इसे अपने अंतिम राज्य के आधार पर खुद को दोबारा बनाना [यानी जैसा कि यह था आपका सबप्लॉट])। मुझे लगता है कि आपकी समस्या यह है कि WxFrame ताज़ा नहीं है।

इसे ठीक करने का सबसे आसान तरीका यह है कि इसे अपने "साफ़ करें" ईवेंट पर स्वयं आकार दें। कुछ ऐसा:

def on_button_clear(self, evt): 
    if self.subframe_opened: 
     self.subframe.Close() 
    self.figure.set_canvas(self.figurecanvas) 
    self.axe.clear() 
    self.figurecanvas.draw() 
    self.SetSize((self.Size[0],self.figurecanvas.Size[1])) 

सेट आकार फ्रेम और सभी नियंत्रणों को फिर से खींचा जाने का कारण बनता है।

यह कहा गया कि, मुझे लगता है कि दो आकृतिवानों के बीच आपकी आकृति साझा करना खतरनाक है। मैं अलग-अलग संयोजनों में चीजों को क्लिक/आकार बदलकर कुछ गंभीर त्रुटियों का उत्पादन करने में सक्षम था। अवसर पर जब आपका उपखंड बंद हो गया था, तो यह आपके कचरे को कचरा होगा, जिससे यह आपके मुख्य फ्रेम में अनुपलब्ध हो जाएगा।

+0

आकार बदलना मेरे मामले में उपयोगकर्ता के अनुकूल नहीं होगा, लेकिन धन्यवाद, ऐसा लगता है कि मैं आंकड़े साझा करने से बचने के लिए सबसे अच्छा कर सकता हूं। – Alex

+0

'self.axe.clear()' बहुत धीमा है! मैं अपना ऐप, मुझे कई बार साजिश करने की ज़रूरत है, 'self.axe.clear()' मेरे ऐप को 0.5 के लिए लटकाएगा :( –

संबंधित मुद्दे