必要に応じて、GUI 全体と実行に必要なファイルを投稿できます。いくつかの異なるモデルに対応するフレームに数式を埋め込もうとしています。これらのフレームはすべて、アプリケーションの開始時にロードされます。これは WIP であるため、描画される方程式は ifs を使用してハードコードされており、後で外部構成ファイルによって提供されます (GUI の残りの部分については既に行っています)。
「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()
ご覧のとおり、Model クラスのインスタンスには、適切なモデル名 (ラベルは正しく移動します) と LaTeX 方程式と化学反応のセット (これらは正しく移動しません) を持つ Label があります。これをどのように言い換えますか?私は無駄にさまざまなアプローチを試みました。ラベルを使用するとナビゲーションの問題は明らかに解決しますが、tk.Label は LaTeX を理解できません。tk.Canvas も同様です。MatPlotLib Tkinter バックエンドのみが LaTeX を理解します。
フレームが上に移動したときに、LaTeX 方程式が tk.Labels に従うようにします。