如何在matplotlib中已绘制的线上添加一条线?

时间:2020-09-30 19:41:15

标签: python matplotlib tkinter

我有一个tkinter窗口,在第一页上,我嵌入了matplotlib图,也使用tkinter条目小部件来获取用户值。我能够从用户值中提取内容,但是我想保留已经绘制的内容。同时删除最近绘制的线条。

我对OOP还是陌生的,因此通过教程和这里的帮助我迷迷糊糊了。任何建议或帮助将不胜感激。

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from matplotlib import style
import tkinter as tk    
from tkinter import ttk
from tkinter import *
    
LARGE_FONT = ('Verdana',12)
style.use('ggplot')

from matplotlib import pyplot as plt    

class Stress(tk.Tk):
    def __init__(self):

        tk.Tk.__init__(self)
        
        tk.Tk.iconbitmap(self,default='icon1.ico')
        tk.Tk.wm_title(self,'Stress Members')
        
        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand='False')
        container.grid_rowconfigure(0,weight=1)
        container.grid_columnconfigure(0,weight=1)

        self.frames ={}
        frame= PageOne(container,self)
        self.frames[PageOne] = frame
        frame.grid(row=0, column=0, sticky='nsew')


    def show_frame(self,cont):

        frame=self.frames[cont]
        frame.tkraise()
    

class PageOne(tk.Frame):
    
    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self,text='Experiment', font = LARGE_FONT)
        label.pack(pady=10,padx=10)

        
        self.adding_widgets()

        button2= ttk.Button(self,text='Validate', command=self.draw)
        button2.pack()

        button3= ttk.Button(self,text='Erase', command=self.dlet)
        button3.pack()
            
        
        self.f1= Figure(figsize=(5,5),dpi=100)
        self.b=self.f1.add_subplot(1,1,1)
        self.canvas = FigureCanvasTkAgg(self.f1, self)
        self.canvas.draw()
        self.canvas.get_tk_widget().pack(side=tk.TOP,fill=tk.BOTH,expand=True)
        
        self.line, = self.b.plot(range(5)) ## problem here as well, want empty/blank page but have to do this to make it work
                                            ## dont know how to declare a blank empty page
            

    def adding_widgets(self,*args):
        labfram=ttk.LabelFrame(self,width=100,height=100,text='Enter Member Coordinates')
        labfram.pack()
        

        l1=ttk.Label(labfram,text='x0')
        l1.pack(side='left')
        self.e1=Entry(labfram,width=10,)
        self.e1.pack(side='left')


        l2=ttk.Label(labfram,text='y0')
        l2.pack(side='left')
        self.e2=Entry(labfram,width=10)
        self.e2.pack(side='left')


        l3=ttk.Label(labfram,text='x1')
        l3.pack(side='left')
        self.e3=Entry(labfram,width=10)
        self.e3.pack(side='left')


        l4=ttk.Label(labfram,text='y1')
        l4.pack(side='left')
        self.e4=Entry(labfram,width=10)
        self.e4.pack(side='left')
        
            
    def draw(self):
        
        print("x0 %s\ny0 %s\nx1 %s\ny1 %s" % (self.e1.get(), self.e2.get(),self.e3.get(),self.e4.get()))
        self.line.set_xdata([float(self.e1.get()), float(self.e3.get())])
        self.line.set_ydata([float(self.e2.get()),float(self.e4.get())])
        self.canvas.draw()

        ## Above code draws a line but I want to keep it so user can draw one line after the other 
    
    def dlet(self):
        
        # want to delete the most recent line drawn here 

        return None

    

app = Stress()
app.mainloop()

1 个答案:

答案 0 :(得分:0)

通过研究和测试,我现在能够解决ike,现在可以画一条线,以及如何删除最新的线

containers:
        # Runs calico-node container on each Kubernetes node. This
        # container programs network policy and routes on each
        # host.
        - name: calico-node
          image: calico/node:v3.16.1
          ports:
          - containerPort: 9090