Ключевое событие в savefig в python. Как это сделать?

1

Я пытаюсь понять, что 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. Пожалуйста, помогите с этим: Как сохранить изображение масштабирования с помощью ключевого события?

Мне жаль мое невежество в питоне, я очень новичок в этом.

Теги:
image-processing
matplotlib
keyboard

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню