建议你把代码格式化一下,编辑框上有代码块选项,选中代码再点击如下图标就可以格式化。
说说这段代码的问题。因为tk我没怎么用过,说明如果有错,帮忙指正。
def figure(self):
f1=Figure((4,3))
self.f11=f1.add_subplot(111)
self.canvas=FigureCanvasTkAgg(f1,self.root)
self.canvas.get_tk_widget().place(x=0,y=50)
f2=Figure((4,3))
self.f22=f2.add_subplot(111)
self.canvas=FigureCanvasTkAgg(f2,self.root)
self.canvas.get_tk_widget().place(x=400,y=50)
首先你要理解什么是canvas,它的英文解释帆布、油画布。可以理解为画纸。梳理下上面的逻辑:创建一个名为f1的figure;
在f1中创建了名为f11的plot;
创建了名为canvas的画布,并传入名为f11为figure;
创建一个名为f2的figure;
在f1中创建了名为f22的plot;
创建了名为canvas的画布,并传入名为f22为figure;
canvas前后被赋值两次,但canvas只能指向一张画纸。指向了第二张必然失去对第一张的引用,第一张画纸就被清理掉。画纸上只能有一个figure,f1是挂在第一张上的,此时在f1中的f11上作画,其实就相当于在空中挥笔,毫无痕迹。
修改之后的代码是什么样子,如下:
lass Ra:
def __init__(self):
self.root = Tk()
self.x = np.arange(0, 1, 0.01)
self.root.title('Ra')
self.root.geometry('800x400+300+100')
self.canvas = Canvas()
self.figure()
self.radio_button()
self.root.mainloop()
def figure(self):
f = Figure((8, 3))
self.plot1 = f.add_subplot(1, 2, 1)
self.plot2 = f.add_subplot(1, 2, 2)
self.canvas = FigureCanvasTkAgg(f, self.root)
self.canvas.get_tk_widget().place(x=10, y=50)
def radio_button(self):
var = StringVar()
r1 = Radiobutton(self.root, text='sin', variable=var, value='A', command=self.sin)
r1.place(x=10, y=10)
r2 = Radiobutton(self.root, text='cos', variable=var, value='B', command=self.cos)
r2.place(x=150, y=10)
def sin(self):
self.plot1.clear()
self.y = np.sin(self.x)
self.plot1.plot(self.x, self.y)
self.canvas.draw()
def cos(self):
self.plot2.clear()
self.yy = np.cos(self.x)
self.plot2.plot(self.x,self.yy)
self.canvas.draw()
if __name__=='__main__':
ra=Ra()
主要看其中一段
def figure(self):
f = Figure((8, 3))
self.plot1 = f.add_subplot(1, 2, 1)
self.plot2 = f.add_subplot(1, 2, 2)
self.canvas = FigureCanvasTkAgg(f, self.root)
self.canvas.get_tk_widget().place(x=10, y=50)
首先创建了名为f的figure,通过add_subplot在其中画了两个plot,布局为一行两列。然后将这个figure附在了某张画布上。此时只有一个canvas,作出的画就可以展示了。