如果需要,我可以發佈完整的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。
哇...謝謝!有沒有辦法在畫布上添加relief = SUNKEN? – user2126752
我在最後一個畫布周圍出現黑框(導航現在可以使用,謝謝!)。另外,當我在主機窗口上使用self.quit()和self.destroy()退出應用程序時,我得到:「致命的Python錯誤:PyEval_RestoreThread:NULL tstate」。我應該出示整個代碼,以便看看嗎? – user2126752
@ user2126752:我從來沒有使用matplotlib,所以我可能無法幫助你看到你看到的致命錯誤,因爲這看起來是來自matplotlib。 –