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