4

编辑:这似乎是一个仅限于 Mac OS 系统上的 Tcl/Tk 的问题。所以如果你没有这方面的经验,这个话题可能没有实际意义......

我想要一个 Python 脚本来做两件事:

  1. 通过 Tkinter 文件对话框向用户询问文件名。
  2. 从所述文件中绘制一些数据。

问题是,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 不是很精通,而且我没有找到关于这个问题的令人满意的信息。但我的直觉告诉我,必须有一个简单而优雅的解决方案。

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

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

谢谢,

弗洛赫

4

0 回答 0