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

1 投票
1 回答
1587 浏览
提问于 2025-04-17 01:24

我正在学习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()

撰写回答