Matplotlib数字不随帧移动

时间:2013-10-13 08:52:59

标签: python canvas matplotlib tkinter latex

如果需要,我可以发布运行它所需的整个GUI和文件。我试图在与几个不同模型相对应的帧中嵌入数学方程式。所有这些帧都在应用程序开始时加载。这是一个WIP,因此要绘制的方程式使用ifs进行硬编码,稍后将由外部配置文件(我已经为GUI的其余部分完成)提供它们。

我通过为'frame'变量赋值,然后使用frame.tkraise()在每个其他帧的顶部引出选定的变量来浏览这些帧,但数学方程不随帧移动 - 画布方程式保持在主框架中的所有其他东西之上。这导致加载最后一个模型的方程总是在顶部,尽管我移动了框架。

如何重新编写代码,以便方程遵循它们所属的帧?我试过在python @Freenode上搜索,搜索谷歌(大约50页不同的查询)和文档(不幸的是,这对于Tkinter来说非常稀缺)。

以下是代码的摘录:

class Model(tk.Frame):
    def __init__(self, parent, controller, model_name):
        tk.Frame.__init__(self, parent)
        self.label = tk.Label(self, text="Model: %s" % (model_name))
        self.label.grid(row=0, column=0)

        #self.f = mplfig.Figure(figsize=(3.59,3.35))

        print model_name

        if model_name == 'LotkaVolterra':
            self.eq1 = mplfig.Figure(figsize=(3.59,3.35))
            #self.eq1 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white')
            self.eq1.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[X]-k_{2}[X][Y]$', fontsize=14)
            self.eq1.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=-k_{3}[Y]+k_{4}[X][Y]$', fontsize=14)
            self.eq1.text(0.05, 0.625, r'$A+X\rightarrow 2X \;(k_{1})$', fontsize=14)
            self.eq1.text(0.05, 0.500, r'$X+Y\rightarrow 2Y \;(k_{2} \; and \; k_{4})$', fontsize=14)
            self.eq1.text(0.05, 0.375, r'$Y\rightarrow B \;(k_{3})$', fontsize=14)
            #self.eq1.set_xticklabels([])
            #self.eq1.set_yticklabels([])
            #self.eq1.set_xticks([])
            #self.eq1.set_yticks([])
            self.canvas = tkagg.FigureCanvasTkAgg(self.eq1, master=parent)
            #self.canvas.show()
            self.canvas.get_tk_widget().grid(row=1)

        elif model_name == 'Brusselator':
            self.eq2 = mplfig.Figure(figsize=(3.59,3.35))
            #self.eq2 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white')
            self.eq2.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[A]-k_{2}[B][X]+k_{3}[X]^{2}[Y]-k_{4}[X]$', fontsize=14)
            self.eq2.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=k_{2}[B][X]-k_{3}[X]^{2}[Y]$', fontsize=14)
            self.eq2.text(0.05, 0.625, r'$A\rightarrow X \;(k_{1})$', fontsize=14)
            self.eq2.text(0.05, 0.500, r'$B+X\rightarrow Y+D \;(k_{2})$', fontsize=14)
            self.eq2.text(0.05, 0.375, r'$2X+Y\rightarrow 3X \;(k_{3})$', fontsize=14)
            self.eq2.text(0.05, 0.250, r'$X\rightarrow E \;(k_{4})$', fontsize=14)
            #self.eq2.set_xticklabels([])
            #self.eq2.set_yticklabels([])
            #self.eq2.set_xticks([])
            #self.eq2.set_yticks([])
            self.canvas = tkagg.FigureCanvasTkAgg(self.eq2, master=parent)
            #self.canvas.show()
            self.canvas.get_tk_widget().grid(row=1)

        elif model_name == 'Oregonator':
            self.eq3 = mplfig.Figure(figsize=(3.59,3.35))
            #self.eq3 = self.f#.add_axes([0.0, 0.0, 1.0, 1.0], axisbg='white')
            self.eq3.text(0.05, 0.875, r'$\frac{d[X]}{dt}=k_{1}[A][Y]-k_{2}[X][Y]+k_{3}[A][X]-2k_{4}[X]^{2}$', fontsize=13)
            self.eq3.text(0.05, 0.750, r'$\frac{d[Y]}{dt}=-k_{1}[B][X]-k_{2}[X][Y]+0.5fk_{5}[B][Z]$', fontsize=13)
            self.eq3.text(0.05, 0.625, r'$\frac{d[Y]}{dt}=2k_{3}[A][X]-k_{5}[B][Z]$', fontsize=13)
            self.eq3.text(0.05, 0.500, r'$A+Y\rightarrow X+P \;(k_{1})$', fontsize=13)
            self.eq3.text(0.05, 0.400, r'$X+Y\rightarrow 2P \;(k_{2})$', fontsize=13)
            self.eq3.text(0.05, 0.300, r'$A+X\rightarrow 2X+2Z \;(k_{3})$', fontsize=13)
            self.eq3.text(0.05, 0.200, r'$2X\rightarrow A+P \;(k_{4})$', fontsize=13)
            self.eq3.text(0.05, 0.100, r'$B+Z\rightarrow fY \;(k_{5})$', fontsize=13)
            #self.eq3.set_xticklabels([])
            #self.eq3.set_yticklabels([])
            #self.eq3.set_xticks([])
            #self.eq3.set_yticks([])
            self.canvas = tkagg.FigureCanvasTkAgg(self.eq3, master=parent)
            #self.canvas.show()
            self.canvas.get_tk_widget().grid(row=1)

        #self.canvas = tkagg.FigureCanvasTkAgg(self.f, master=parent)
        #self.canvas.show()
        #self.canvas.get_tk_widget().grid(row=1)
        self.grid()

正如您所看到的,Model类的实例将具有带有适当模型名称的Label(标签正确移动)以及LaTeX方程和化学反应集(这些不能正确移动)。我该怎么说呢?我尝试了各种方法无济于事。使用标签显然可以解决导航问题,但是tk.Label不了解LaTeX。也不是tk.Canvas。只有MatPlotLib Tkinter后端才能理解LaTeX。

当帧向上移动时,我希望LaTeX方程遵循tk.Labels。

1 个答案:

答案 0 :(得分:1)

创建画布时,执行master=parent。您是否尝试过将master设为self