pyplot.show()重新打开旧的tkinter对话框

时间:2013-04-23 06:43:29

标签: python macos matplotlib tkinter filedialog

编辑:这似乎是Mac OS系统上限制为Tcl / Tk的问题。因此,如果您没有这方面的经验,这个主题可能没有实际意义......

我希望有一个Python脚本可以完成两件事:

  1. 通过Tkinter文件对话框询问用户文件名。
  2. 从所述文件中绘制一些数据。
  3. 问题是,matplotlib使用Tkinter进行图形表示,每当我在非交互模式下调用pyplot.show()时,(再次关闭前)文件对话框会再次弹出。在我看来,pyplot.show()收集了所有Tkinter窗口的列表并将它们全部显示出来。但是我没有找到任何帮助。我试过Python 2.7和3.3,因为很多Tkinter模块似乎已经改变了,但它是同样的现象。我想出的稍微奇怪的解决方法是进入matplotlib交互模式,然后使用raw_input()命令打开窗口。

    这是一个在Python 2和3中工作的最小代码片段,用于显示问题:

    import matplotlib.pyplot as plt
    
    # import Tkinter GUI (changes from Python 2.x to 3.x)
    try:
        import Tkinter
    except (ImportError):
        import tkinter as Tkinter
    try:
        from tkFileDialog import askopenfilename
    except (ImportError):
        from tkinter.filedialog import askopenfilename
    
    root = Tkinter.Tk()
    root.withdraw()
    
    input_filename = askopenfilename(master=root)
    
    # This seemed promising, but it doesn't help
    root.destroy()
    
    plt.figure()
    
    # uncommenting this to switch to interactive mode is a workaround
    #plt.ion()
    plt.show()
    
    # Python 2.x and 3.x compatible wait for input:
    try: input = raw_input
    except NameError: pass
    # Wait for keystroke (for interactive mode)
    input("Press enter when done...")
    

    如果我在这里遗漏了一些明显的东西,我很抱歉,我不是很精通Python,而且我没有找到关于这个问题的令人满意的信息。但是我的gutt告诉我必须有一个简单而优雅的解决方案。

    系统信息(我尝试过的最新版本):

    • Python 3.3(来自MacPorts)
    • matplotlib 1.3.x(由github master构建)
    • Mac OS X 10.8.3
    • Tcl / Tk 8.6.0(来自MacPorts)

    谢谢,

    Floh

0 个答案:

没有答案