Ключевое событие в savefig в python.Как это сделать? - PullRequest
1 голос
/ 04 сентября 2011

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

Извините за мое невежество в Python, я очень новичок в этом.

1 Ответ

3 голосов
/ 05 сентября 2011

Вы явно не говорите это, но похоже, что вы используете для этого 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...