2015-10-22 35 views
1

我正在使用matplotlib並創建一個圖形添加一個圖。我怎樣才能用一個新的地塊或一個新的地塊網格來替換這個地塊? 在我現在的代碼中,我使用菜單dosomething()創建了一個軸,然後在菜單中使用菜單dosomethingelse()在同一個軸上添加了其他紅線。每次我dosomething(),一個新的數字附加在當前的一個,但我實際上是想在同一個圖中用一個新的替換當前的軸。我怎樣才能做到這一點?如何用新地塊或地塊網格替換matplotlib圖中的以前的地塊?

import numpy as np 
from Tkinter import * 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

class Test1: 
    def __init__(self, windows, data, axes): 
     self.windows = windows 
     self.data = data 
     self.figure = axes.figure 
     self.axes = axes 
     self.im = self.axes.plot(data) 

def dosomething(): 
    global test1 
    global fig 
    fig = Figure(figsize=(12, 4)) 
    axes = fig.add_subplot(111) 
    canvas = FigureCanvasTkAgg(fig, master=windows) 
    canvas.get_tk_widget().pack() 
    data=np.arange(100) 
    test1=Test1(windows, data, axes) 

def dosomethingelse(): 
    global test1 
    test1.axes.plot(np.arange(100)+10*(np.random.rand(100)-0.5),'-r') 
    test1.figure.canvas.show() 

windows = Tk() 
menubar = Menu(windows) 
filemenu = Menu(menubar, tearoff=0) 
filemenu.add_command(label="Do something", command=dosomething) 
filemenu.add_command(label="Do somethingelse", command=dosomethingelse) 
menubar.add_cascade(label="Tool", menu=filemenu) 

windows.config(menu=menubar) 

windows.mainloop() 

回答

1

這看起來不像一個非常標準的做tkinter的方法。至少我不清楚你想達到什麼目的。你在你的dosome內有以下幾行:

test1=Test1(windows, data, axes) 

這就是你每次運行它時產生新窗口的原因。另外,當你在課堂內時,不需要全局變量。只要使用self.variable = ...,變量就可以在整個班級以及您傳遞給該班級的對象中使用。

我沒有試過,但也許是這樣的:

def dosomething(): 
    try: 
     self.canvas.get_tk_widget().destroy() 
    except: 
     pass   
    fig = Figure(figsize=(12, 4)) 
    axes = fig.add_subplot(111) 
    self.canvas = FigureCanvasTkAgg(fig, master=windows) 
    self.canvas.get_tk_widget().pack() 
    data=np.arange(100) # not sure what this is for 

def dosomethingelse(): 
    try: 
     self.canvas.get_tk_widget().destroy() 
    except: 
     pass 
    fig = Figure(figsize=(12, 4)) 
    fig.plot(np.arange(100)+10*(np.random.rand(100)-0.5),'-r') 
    self.canvas = FigureCanvasTkAgg(fig, master=windows) 
    self.canvas.get_tk_widget().pack()   
0

我張貼的完整代碼@DrXorile

import numpy as np 
from Tkinter import * 
from matplotlib.figure import Figure 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

class Test1: 

    def __init__(self, data): 
     self.data = data 

    def dosomething(self): 
     try: 
      self.canvas.get_tk_widget().destroy() 
     except: 
      pass   
     self.figure = Figure(figsize=(12, 4)) 
     self.axes = self.figure.add_subplot(111) 
     self.im = self.axes.plot(data) 
     self.canvas = FigureCanvasTkAgg(self.figure, master=windows) 
     self.canvas.get_tk_widget().pack() 

    def dosomethingelse(self): 
     self.axes.plot(np.arange(100)+10*(np.random.rand(100)-0.5),'-r') 
     self.figure.canvas.show() 

data=np.arange(100) # data to plot 
test1=Test1(data) 

windows = Tk() 
menubar = Menu(windows) 
filemenu = Menu(menubar, tearoff=0) 
filemenu.add_command(label="Do something", command=test1.dosomething) 
filemenu.add_command(label="Do somethingelse", command=test1.dosomethingelse) 
menubar.add_cascade(label="Tool", menu=filemenu) 

windows.config(menu=menubar) 

windows.mainloop() 
的答案後,工作對我來說