Python中savefig的关键事件。怎么做?
我正在学习Python,写一些代码。我想从打开的图像中选择一部分,并保存这部分。现在我想通过按一个键快速保存打开并放大的图像。为了更好地解释,我需要通过按键来触发一个叫做savefig()的函数。
我尝试使用urwid模块:
import urwid
import PIL
import Image
im=Image.Open("fig.tif")
imshow(im)
def save(input):
if input in ('s'):
savefig("fig2.png")
我也用了uinput模块,想做同样的事情:
import uinput
import PIL
import Image
def main():
capabilities = {uinput.EV_KEY: (uinput.KEY_S)}
device = uinput.Device(name="python-uinput-keyboard", capabilities=capabilities)
if device.emit(uinput.EV_KEY, uinput.KEY_S, 1):
savefig("sat.png")
im=Image.open("fig.tif")
imshow(im)
但是这两段代码的结果都是一样的,出现了这个错误信息:
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1413, in call
return self.func(*args)
File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 312, in key_press
FigureCanvasBase.key_press_event(self, key, guiEvent=event)
File "/usr/lib/pymodules/python2.6/matplotlib/backend_bases.py", line 1143, in key_press_event
self.callbacks.process(s, event)
File "/usr/lib/pymodules/python2.6/matplotlib/cbook.py", line 163, in process func(*args, **kwargs)
File "/usr/lib/pymodules/python2.6/matplotlib/backend_bases.py", line 1703, in key_press self.canvas.toolbar.save_figure(self.canvas.toolbar)
TypeError: save_figure() takes exactly 1 argument (2 given)
这很奇怪,因为我从来没有打开过Tkinter。请帮帮我,我该如何通过按键事件来保存放大的图像呢?
对于我在Python方面的无知,我感到很抱歉,我对此很陌生。
1 个回答
3
你没有明确说,但看起来你是在用matplotlib来做这个。
我不能完全确定你发的内容,但我猜可能是因为s
这个键已经被设置为“保存图形”,这是matplotlib的默认设置。(而且matplotlib默认使用的是基于Tk的后端,所以才会出现Tk的错误。)
其实不需要用urwid
这个模块。matplotlib本身就有一些功能可以处理这种情况,你需要断开一些这些功能的连接才能实现你的需求。
这里有一个简单的独立示例,可以帮助你重现这个问题:
import matplotlib.pyplot as plt
import numpy as np
def save(event):
if event.key == 's':
print 'Saved figure'
event.canvas.figure.savefig('temp.png')
fig, ax = plt.subplots()
ax.imshow(np.random.random((10,10)))
fig.canvas.mpl_connect('key_press_event', save)
plt.show()
注意到图形会被保存,但你还会看到一个弹出的文件选择对话框,让你再保存一次图形。
你可以通过以下两种方式避免这种情况:a) 使用一个不同的键(选择一个不在这个列表中的键),或者 b) 暂时禁用matplotlib对's'
键的保存绑定。
其实暂时禁用这个绑定很简单,只需要用合适的matplotlibrc设置就可以了。
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# Disable the 's' interactive keybinding
mpl.rcParams['keymap.save'] = ''
def save(event):
if event.key == 's':
print 'Saved figure'
event.canvas.figure.savefig('temp.png')
fig, ax = plt.subplots()
ax.imshow(np.random.random((10,10)))
fig.canvas.mpl_connect('key_press_event', save)
plt.show()