【问题标题】:Tkinter Matplotlib, backend conflict?Tkinter Matplotlib,后端冲突?
【发布时间】:2012-04-05 02:17:51
【问题描述】:

我对 python 很陌生,但我上周一直在尝试编写一个软件来可视化一些复杂的东西。

基本的过场动画是:用户将所需的所有信息输入到 GUI 中,然后单击继续,我还有另一个重要的功能来生成所有图形。

这是可行的,但问题是当我运行该函数时,它持续了大约 2 分钟,tkinter 窗口冻结了。我读到我应该使用线程。 然后我发现了这个:http://uucode.com/texts/pylongopgui/pyguiapp.html 这是一个基本上可以做我想做的事情以及其他一些事情的例子。

我现在正在尝试调整我的代码以使其适合这个。

这是我的问题:一切似乎都运行良好,只是在我的函数中有一个名为“tk”的新窗口弹出并且所有内容都冻结了。

一切都在这一刻凝固:

# On trace les fils de chaine
for i in range(0, Couches_Trame + 1):
    t = np.arange(0, np.pi, 0.1)
    plt.figure(i)
    plt.title('Plan de Trame ' + str(i+1), fontsize = '16')
    ax = plt.gca()
    ax.yaxis.set_visible(False)
    ax.xaxis.set_visible(False)
    plt.axis([-1, Plans, Fils_Chaine + 1, -1])
    for j in range(0,Plans):
        for k in range(0,Fils_Chaine):
            plt.fill_between(np.cos(t)/8+j, np.sin(t+np.pi)/8+k+0.5, \
            np.sin(t)/8+k+0.5, color='r')
    plt.savefig('Blabla'+int(i))
plt.figure(Couches_Trame)
plt.title('Plan de Trame: Projection')

当我不使用 Tkinter 直接运行它时,一切正常,所以我不知道是什么原因造成的。

我也试过用无限循环替换这段代码:

i=1
while i > 0:
    i=i+1
    print(i)

这行得通,没有什么是冻结的。但后来我尝试了这个:

i=1
while i > 0:
    i=i+1
    plt.plot((i,i))

然后一切都冻结了,名为“tk”的窗口弹出并立即冻结。

我在某处读到这可能是 Tkinter 和 matplotlib 后端之间的冲突,但仅此而已,这对我没有多大帮助。

编辑:我不知道这是否有帮助,但我使用的是 Python Portble 2.7.2.1

【问题讨论】:

    标签: python matplotlib tkinter


    【解决方案1】:

    我不会写 cmets,但需要检查以下几点:

    • 在 python cmdline 上,尝试绘​​制一个非常简单的图形。例如:

      >>> import pyplot
      >>> pyplot.plot([1,3,1,3,1])
      

    我的猜测是这将显示一个 TK 窗口,但随后会停止。

    • 看看 Tkinter 是否真的有效。例如:

      >>> import Tkinter
      >>> import _tkinter
      >>> Tkinter._test()
      

    最后一个命令应该显示一个带有按钮的小窗口。

    另外,你并没有具体说明“冻结”是什么意思:

    • 您的系统是否完全锁定?

    • 脚本是否锁定?或者你可以关闭窗口然后脚本就停止了吗?

    • 是正在绘制什么东西,还是只是弹出一个空的 TK 窗口?

    另一方面,由于您提到了线程,您可能遇到了一般的 GUI 问题:GUI 等待用户输入。如果你想让它等待,同时进行计算,后者确实必须在一个单独的线程中。再说一次,如果您想在每次计算新数字时更新您的图表,则不需要这样做。参见例如http://matplotlib.sourceforge.net/examples/animation/simple_anim_tkagg.html

    最后,如果您指定您的操作系统,如果涉及到调试您的设置,它可能会有所帮助。我假设 Python Portble 是 Portable Python。

    【讨论】:

    • 好吧,看来您在 5 分钟后无法编辑您的 cmets,而且我花了很长时间来编写它。此外,我已经达到了最大字符,所以我的答案将在 2 cmets 中处理:我尝试绘制一个简单的图表,除非我使用 .show() 函数,否则它不会显示任何内容,然后效果很好。 Tkinter 实际上正在工作。当我说冻结时,我的意思是您可以移动窗户,但例如,如果不同的窗户重叠,那么这将导致交界处出现一个白色矩形并且它们没有响应(我不知道我是否在这里清楚)。
    • 函数和 gui 在两个不同的线程中运行,因此当我运行函数时,gui 仍然响应。最后,我通过阅读以下内容找到了我的问题的解决方案:matplotlib.sourceforge.net/faq/usage_faq.html#what-is-a-backend 然后我将 myplotlib 的默认后端从 TkAgg 更改为 WxAgg,它现在可以正常工作了!顺便说一句,我的操作系统是 windows xp,是的 Python Portable 意味着 Portable Python。
    • 听说你解决了它。奇怪的是,从 Tkinter 更改为 WxWidgets 确实使它起作用了;您的 Tkinter 设置似乎无法正常工作。我不知道你是否尝试过我建议的 Tkinter 测试,也不知道你是否仍然有兴趣这样做(因为你已经让它与 Wxwidgets 一起工作),但我想这可能表明是否会有问题Tkinter 设置。以防您将来想使用 Tkinter。
    • 我不知道我是否清楚,但我没有将所有东西从 Tkinter 更改为 Wx。我刚刚更改了 matplotlib 使用的后端。我做了你建议的 Tkinter 测试,效果很好。此外,如果我从 Tkinter 更改为 Wx,那只是因为在我使用不应出现的 matplotlib 时出现了 Tkinter。
    • 嗯,据我所知,TkAgg 后端使用 Tkinter 从 matplotlib 弹出窗口,而 WxAgg 后端使用 WxWidgets(反过来,它使用适合平台的任何东西)。因此,实际上,通过切换后端,您已经切换了 matplotlib 使用的 GUI 工具包。例如,在 Linux(或其他操作系统,如果已安装)上,您甚至可以使用 GTKAgg 后端,它使用 GTK 作为 GUI 部分。这是为了澄清。这一切都在幕后,所以其他都无所谓。
    【解决方案2】:

    在打开 Tkinter 窗口之前尝试关闭 matplotlib 绘图:

    plt.close()
    tk = Tkinter()
    ...
    

    它对我有用。

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      相关资源
      最近更新 更多