如果需要,我可以发布运行它所需的整个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。
答案 0 :(得分:1)
创建画布时,执行master=parent
。您是否尝试过将master
设为self
?