- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 Tkinter 的新手。我尝试使用下一个代码使用 tkFileDialog.askopenfilename
打开一个文件,然后用 Matplotlib 绘制一些东西:
import matplotlib.pyplot as plt
import Tkinter, tkFileDialog
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
x = range(10)
plt.plot(x)
plt.show()
运行上面的脚本后,我得到一个对话框窗口来打开我的文件。选择文件后,我会重复打开文件的对话窗口和屏幕底部的新窗口。我知道问题出在 plt.show()
上。会发生什么以及如何避免对话窗口重新打开?我应该为我的任务设置一个 Matplotlib 后端吗?
我的版本:
Tcl/Tk 8.5.9
Matplotlib 1.3.1
Tkinter $修订版:81008 $
OS X 10.9.4
我发现了两个相关的 stackoverflow 问题: pyplot-show-reopens-old-tkinter-dialog和 matplotlib-figures-not-working-after-tkinter-file-dialog但没有答案。 root.destroy()
似乎对我不起作用。
最佳答案
当使用 python test.py
运行时,以下似乎对我有用:
import matplotlib.pyplot as plt
import Tkinter, tkFileDialog
root = Tkinter.Tk()
root.withdraw()
file_path = tkFileDialog.askopenfilename()
root.destroy()
print file_path
x = range(10)
plt.plot(x)
plt.show()
我认为它有效,因为文件对话框的 Tk 实例在 matplotlib 启动它自己之前被销毁了。有趣的是,从
ipython --pylab=tk
我预计两次启动事件循环会出现问题。在这种情况下,规范的解决方案是在(再次)启动之前检查 Tk 是否已经在运行。
我在 MacOSX 10.7.5 上,自定义构建的 matplotlib(应该无关紧要)。
我唯一注意到的是,在对此进行试验后,我的 Mac 上的触摸板滑动手势不再有效......调查一下。
编辑
这是 tkFileDialog.askopenfilename()
执行的 Tk 命令的分解:
# breakdown of tkFileDialog.askopenfilename()
import Tkinter as Tk
window = Tk.Tk()
window.withdraw()
w = Tk.Frame(window)
s = w.tk.call('tk_getOpenFile', *w._options({}))
print s
w.destroy()
window.destroy()
当我运行它时(使用 python test.py
),我会看到一个文件打开对话框,我可以在其中选择一个文件。 “确定”后,它会打印文件名并退出。这在我的系统上每次都有效。但是,有时我的触摸板上的三指手势在运行该程序时会停止工作!程序退出后他们不会回来!甚至在我杀死程序正在运行的终端之后!!!
我发现将它们带回来的唯一方法是将以下 matplotlib 代码添加到 test.py
:
import matplotlib
matplotlib.use('tkagg')
import matplotlib.pyplot as plt
plt.figure() # simplified from plt.plot(range(10))
plt.show()
然后点击“图1”的标题栏。这会立即带回三指手势。我怀疑这只是 Tkinter
中的一个错误。 (顺便说一句,我使用的是 Tcl/Tk 8.5)
我无法重现文件打开对话框在我的系统上不断重新启动的行为。
如果您在没有任何 matplotlib 命令的情况下启动 test.py
,您能否描述一下您的系统会发生什么情况?
或者,由于 Tkinter 很旧而且明显有问题,我可以建议改用 Qt 吗?它不仅看起来更漂亮,而且更敏捷,而且我没有遇到任何错误问题。
编辑2
我已经分解了 matplotlib 在非交互式环境中执行上述命令时所采取的 Tk 操作(即使用 python test.py
而不是来自 iPython)。这些是基本的后端调用:
import matplotlib.backends.backend_tkagg as backend
figManager = backend.new_figure_manager(1)
figManager.show()
backend.show.mainloop()
这些仍然是后端独立的。即,对于 Qt 图,只需使用:
import matplotlib.backends.backend_qt4agg as backend
如果我们进一步将其分解为特定于后端的层,我们有:
import matplotlib.backends.backend_tkagg as backend
import Tkinter as Tk
window = Tk.Tk()
window.withdraw()
# uncomment this to use the same Tk instance for tkFileDialog and matplotlib
#import tkFileDialog
#fname = tkFileDialog.askopenfilename(master=window)
#print fname
# figManager = backend.new_figure_manager(1)
from matplotlib.figure import Figure
figure = Figure()
canvas = backend.FigureCanvasTkAgg(figure, master=window)
figManager = backend.FigureManagerTkAgg(canvas, 1, window)
# figManager.show()
window.deiconify()
# backend.show.mainloop()
Tk.mainloop()
首先,在 tkFileDialog 调用被注释掉的情况下运行,并检查 matplotlib 图形是否出现并正确运行。然后取消对 tkFileDialog 调用的注释,看看您是否最终获得了预期的行为。
如果不是,则必须继续分解 FigureCanvasTkAgg
和 FigureManagerTkAgg
以了解发生了什么......
编辑3
OK,既然问题依旧,让我们进一步分解matplotlib的Tk调用。下面的代码完全隔离了我认为必不可少的所有 matplotlib 的 Tk 操作(因此不再需要从 matplotlib 导入任何东西!)。请注意,我没有生成工具栏并分配大量回调和按键事件。如果下面的代码现在可以工作,那么问题就出在这些地方。如果它不起作用,我们可以得出结论,这纯粹是一个 Tk 问题,很可能是一个应该报告的错误。这是代码:
import Tkinter as Tk
window = Tk.Tk()
window.withdraw()
# uncomment this to use the same Tk instance for tkFileDialog and matplotlib
#w = Tk.Frame(window)
#fname = w.tk.call('tk_getOpenFile', *w._options({}))
#print fname
#w.destroy()
# canvas = backend.FigureCanvasTkAgg(figure, master=window)
_tkcanvas = Tk.Canvas(master=window, width=640, height=480, borderwidth=4)
_tkphoto = Tk.PhotoImage(master=_tkcanvas, width=640, height=480)
_tkcanvas.create_image(320, 240, image=_tkphoto)
_tkcanvas.focus_set()
# figManager = backend.FigureManagerTkAgg(canvas, 1, window)
window.wm_title("Figure 1")
window.minsize(480, 360)
_tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
# figManager.show()
window.deiconify()
# backend.show.mainloop()
Tk.mainloop()
请尝试注释掉一些行,看看是否可以使其正常工作。如果不是,我会得出结论,这是 Tkinter
中的错误,应该报告。
关于python - 在 Mac OS X 上使用 Tkinter 和 Matplotlib 重复对话窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24660578/
在几个 SO 的问题中,有这些行可以访问代码的父目录,例如os.path.join(os.path.dirname(__file__)) returns nothing和 os.path.join(o
我想用 Python 更改文件模式。 os 模块具有三个功能上看似相同的功能: os.chmod os.fchmod os.lchmod 这三个版本有什么区别? 最佳答案 chmod 用于更改路径指定
考虑: pipe_read, pipe_write = os.pipe() 现在,我想知道两件事: (1) 我有两个线程。如果我保证只有一个正在读取 os.read(pipe_read,n) 而另一个
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
让我们以硬盘驱动器/网络接口(interface)为例。它由多个进程共享。现在多个进程可能会向硬盘驱动器发出并发命令来读取数据。当数据可用时,内核如何知道哪个进程的数据已准备好?操作系统和硬盘驱动器之
嗨,我正在尝试编写像这样的原子写入函数...... with tempfile.NamedTemporaryFile(mode= "w", dir= target_directory) as f:
net.Conn接口(interface)提供了 SetTimeout 方法,我应该用 os.Timeout 检查返回的错误.但是我看不到在返回的 os.Error 上调用 os.Timeout 的方
我正在使用 os 模块在我的 Django 项目 settings.py 文件中具有相对路径。变量 SITE_ROOT 设置为 settings.py 文件的当前工作目录,然后用于引用同样位于同一目录
正如我们所知,Windows 接受 "\" 和 "/" 作为分隔符。但是在python中,使用的是"\"。例如,调用 os.path.join("foo","bar"),将返回 'foo\\bar'。
我有以下工作目录:/Users/jordan/Coding/Employer/code_base ,我想要获取绝对路径的文件位于 /Users/jordan/Coding/Employer/code_
在 Python 中,如果路径中包含“~”,我能否确定扩展的用户调用将是绝对路径? 例如,这个表达式是否总是为真? path = '~/.my_app' os.path.expanduser(path
我是 Django 项目的初学者。Django 项目的 settings.py 文件包含这两行: BASE_DIR = os.path.dirname(os.path.dirname(os.path.
我有一个旧 MAC OS 文件存储中的文件集合。我知道集合存在文件名/路径名问题。问题源于我认为在原始操作系统中呈现为破折号的路径中包含一个代码点,但 Windows 与代码点斗争,并且其中一个包含
Ubuntu怎么安装mac os x主题呢?下文小编将为大家分享ubuntu14.04安装mac os x主题教程,安装MAC OS X&
我有一个 Firefox OS 应用程序,我希望在该应用程序之外打开一个链接(该链接指向不同的站点,在应用程序中打开它会使应用程序在没有强制的情况下无法使用)。我怎么做? Related bug re
我想为 Firefox OS 编写我的应用程序.使用什么样的语言(如 Android 的 Java 和 iOS 的 Objective C++)和工具(如 Eclipse、Xcode)? 最佳答案 适
我正在尝试创建一个 Palm OS 应用程序,以每 X 分钟或几小时检查一次网站,并在有数据可用时提供通知。我知道这种事情可以在新的 Palm 上完成——例如,当应用程序不在顶部时,我的 Centro
我需要在 Firefox OS 中显示全屏图像。我有一个具有 qHD 分辨率(960x540 像素)的“峰值”开发预览手机。 如何确保我的应用程序在其他具有不同屏幕分辨率的 firefox-os 设备
我正在尝试在 Firefox OS 中安装一个新的语言环境,但我不确定我是否正确地按照这些步骤操作。 首先,我尝试使用 Mercurial 下载所需的语言环境:它对我不起作用,Mercurial 说访
我有这个shell脚本Test.sh: #! /bin/bash FILE_TO_CHECK="/Users/test/start.txt" EXIT=0 while [ $EXIT -eq 0 ];
我是一名优秀的程序员,十分优秀!