2013-10-13 24 views
0

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

我正在浏览这些帧,方法是将一个值赋给'frame'变量,然后使用frame.tkraise()在每个其他帧的顶部增加所选变量,但数学方程不随帧移动 - 方程式画布留在主框架中的所有其他东西之上。尽管我移动了框架,但这导致最后一个模型始终处于顶部的方程式加载。

如何更改代码以便方程式遵循它们所属的框架?我尝试过在Python @ Freenode上搜索,搜索Google(约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。

回答

1

当你创建画布时,你会做master=parent。您是否尝试将master设置为self

+0

哇...谢谢!有没有办法在画布上添加relief = SUNKEN? – user2126752

+0

我在最后一个画布周围出现黑框(导航现在可以使用,谢谢!)。另外,当我在主机窗口上使用self.quit()和self.destroy()退出应用程序时,我得到:“致命的Python错误:PyEval_RestoreThread:NULL tstate”。我应该出示整个代码,以便看看吗? – user2126752

+0

@ user2126752:我从来没有使用matplotlib,所以我可能无法帮助你看到你看到的致命错误,因为这看起来是来自matplotlib。 –