2013-10-13 25 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。 –