python中savefig中的关键事件。怎么做?

时间:2011-09-04 14:24:52

标签: python image-processing keyboard matplotlib

我试着理解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)

我在这2个代码中得到了相同的结果,出现了以下错误消息:

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。请帮忙,如何通过按键事件保存缩放图像?

我对蟒蛇的无知感到抱歉,我对此非常陌生。

1 个答案:

答案 0 :(得分: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)使用不同的密钥(不在the list here中)或b)暂时禁用matplotlib的's'密钥绑定以进行保存。

使用适当的matplotlibrc setting暂时禁用它很容易。

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()