Tkinter/Matplotlib后端冲突导致无限主循环。

8

考虑运行以下代码(请注意,这是一个极为简化的版本,以演示问题):

import matplotlib.pyplot as plot
from tkinter import * #Tkinter if your on python 2

def main():

    fig = plot.figure(figsize=(16.8, 8.0))

    root = Tk()
    w = Label(root, text="Close this and it will hang!")
    w.pack()
    root.mainloop()

    print('Code never reaches this point')

if __name__ == '__main__':
    main()

关闭第一个窗口没问题,但关闭第二个窗口会导致代码挂起,因为 root.mainloop() 引起了无限循环。这个问题是因为调用了 fig = plot.figure(figsize=(16.8, 8.0)) 所引起的。有谁知道如何在执行 matplotlib.pyplot 调用后成功关闭 root?


2
pyplot 还会启动自己的主循环,我猜这可能是你的问题所在。请参考 http://matplotlib.org/examples/user_interfaces/ 了解如何将 mpl 嵌入到你选择的 GUI 中。 - tacaswell
有没有办法强制关闭pyplot主循环?该问题会影响到pyplot调用后的所有后续tkinter窗口,甚至在不同模块中也是如此。 - TheoretiCAL
2个回答

8
import matplotlib
from tkinter import *

def main():

    fig = matplotlib.figure.Figure(figsize=(16.8, 8.0))

    root = Tk()
    w = Label(root, text="Close this and it will not hang!")
    w.pack()
    root.mainloop()

    print('Code *does* reach this point')

if __name__ == '__main__':
    main()

当在一个 Tkinter 窗口中嵌入一个 matplotlib 图形时,使用 matplotlib.figure.Figure 而不是 plt.Figure


我的答案依然不变 - 特别是使用matplotlib.figure.Figure而不是plt.Figure。仅这一个更改就可以使您的代码工作。 - unutbu
很酷,那一行就是我需要的,你能解释一下 matplotlib.figure.Figure 和 plt.Figure 在主循环中的后端区别吗?谢谢! - TheoretiCAL
6
plt.figure使用一个图形管理器来控制主循环/用户界面等。matplotlib.figure.Figure只是一个Figure对象,需要你自己处理用户界面。 - tacaswell

0

我解决了matplotlib与Tkinter冲突的问题,方法是在打开Tkinter窗口之前“关闭”matplotlib绘图(在绘图完成后):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接