0

画像編集プログラムに元に戻す機能を実装しようとしています。以下は私のコードの一部です:

def displayim(root, panel, img, editmenu):
    global image, L
    L.append(img)
    print(len(L))
    if (len(L) > 1):
        editmenu.entryconfig(0, state=NORMAL)
    else:
        editmenu.entryconfig(0, state=DISABLED)    
    image1 = ImageTk.PhotoImage(img)
    root.geometry("%dx%d+%d+%d" % (img.size[0], img.size[1], 200, 200))
    panel.configure(image = image1)
    panel.pack(side='top', fill='both', expand='yes')
    panel.image = image1
    image = img

def undo(root, panel, editmenu):
    global L
    i = len(L)
    del L[i-1]
    last = L.pop
    displayim(root, panel, last, editmenu)

私の考えは、画像を開いたり、画像に効果を追加したりする関数が呼び出されると、 を呼び出して結果を表示するというものdisplayimです。このパラメーターeditmenuは、元に戻すものが何もない場合、undoコマンドが無効になるようにします。変数Lは、各関数が呼び出された後のイメージの状態を格納するために使用されるリストです。関数が呼び出されると、undoリスト内の最後の項目と、最後の項目の前の項目 (現在は最後になりました) が削除され、この新しい最後の項目が に渡されdisplayimて、プログラムがイメージの以前の状態を表示し、再びリストに追加します。

ただし、undo関数を使用しようとすると、次のエラーが発生しました。

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Python32\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "D:\Users\ichigo\workspace\SS2\test\main.py", line 26, in <lambda>
    editmenu.add_command(label="Undo", command=lambda:file.undo(root, panel, editmenu), state=DISABLED)
  File "D:\Users\ichigo\workspace\SS2\test\file.py", line 51, in undo
    displayim(root, panel, last, editmenu)
  File "D:\Users\ichigo\workspace\SS2\test\file.py", line 39, in displayim
    image1 = ImageTk.PhotoImage(img)
  File "D:\Python32\lib\site-packages\PIL\ImageTk.py", line 110, in __init__
    mode = Image.getmodebase(mode)
  File "D:\Python32\lib\site-packages\PIL\Image.py", line 225, in getmodebase
    return ImageMode.getmode(mode).basemode
  File "D:\Python32\lib\site-packages\PIL\ImageMode.py", line 50, in getmode
    return _modes[mode]
TypeError: unhashable type: 'list'
Exception AttributeError: "'PhotoImage' object has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage object at 0x01B1AA50>> ignored 

このエラーは、 fromlastに渡した変数が PIL イメージ オブジェクトではないため、 に追加できないことを意味していると思います。今すぐ利用できる解決策はありますか? 何か提案があれば教えてください。displayimundoPhotoImage

4

1 に答える 1

4

あなたはに変更する必要がありlast = L.popますlast = L.pop()

L.popa を返す<build-in method pop of list object>が、a を返さないPIL image object

于 2012-06-05T02:17:01.837 に答える