【问题标题】:Matplotlib figures not moving with framesMatplotlib 图形不随帧移动
【发布时间】:2013-10-13 08:52:59
【问题描述】:

如果需要,我可以发布运行它所需的整个 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 类的实例将有一个带有适当模型名称的标签(标签正确移动)和一组 LaTeX 方程和化学反应(这些不会正确移动)。我该如何改写这个?我尝试了各种方法都无济于事。使用标签显然可以解决导航问题,但 tk.Label 不理解 LaTeX。 tk.Canvas 也没有。只有 MatPlotLib Tkinter 后端支持 LaTeX。

当框架向上移动时,我希望 LaTeX 方程遵循 tk.Labels。

【问题讨论】:

    标签: python canvas matplotlib tkinter latex


    【解决方案1】:

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

    【讨论】:

    • 哇...谢谢!有没有办法在画布上添加浮雕=SUNKEN?
    • 我在最后一个画布周围出现了一个黑框(现在可以导航了,谢谢!)。此外,当我在大型机窗口上使用 self.quit() 和 self.destroy() 退出应用程序时,我得到以下信息:“致命的 Python 错误:PyEval_RestoreThread: NULL tstate”。我应该展示整个代码以便您看一下吗?
    • @user2126752:我从未使用过 matplotlib,所以我可能无法帮助您解决您看到的致命错误,因为它看起来来自 matplotlib。
    • 有没有更好的方法来嵌入方程?我宁愿避免使用图片并将它们保留为 TeX。
    • @user2126752:我不知道。我从来不需要这样做。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2019-06-14
    • 2016-08-10
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多