0

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

我通过为“框架”变量分配一个值然后使用 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()

如您所见,模型类的实例将有一个带有适当模型名称的标签(标签正确移动)和一组 LaTeX 方程和化学反应(这些不能正确移动)。我该如何改写这个?我尝试了各种方法都无济于事。使用标签显然可以解决导航问题,但 tk.Label 不理解 LaTeX。tk.Canvas 也没有。只有 MatPlotLib Tkinter 后端理解 LaTeX。

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

4

1 回答 1

1

当您创建画布时,您会这样做master=parent。你试过设置masterself

于 2013-10-13T16:25:30.500 回答