我试着理解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。请帮忙,如何通过按键事件保存缩放图像?
我对蟒蛇的无知感到抱歉,我对此非常陌生。
答案 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()