1

一部のPython 2.7コードを Eclipse の新しいメソッドにリファクタリングしようとしています。以下のコメントでマークされたブロックでEclipse を使用した後Refactoring->Extract method、イメージが GUI に表示されなくなりました。

from Tkinter import Tk, Button, W, E, N, S, Label, Frame

from PIL import Image, ImageTk

def myCallback():
    pass

root = Tk()

# start refactor method here

root.geometry('400x400')
runButton = Button(root, text="Run",bg='green',
    command=myCallback)
runButton.grid(row=2, column=0,
        padx=10, pady=10)
quitButton = Button(root, text="Quit",
command=root.quit)
quitButton.grid(row=2, column=1,
        padx=10, pady=10)

frame1 = Frame(width=200, height=200)
frame1.grid(row=1, column=0, columnspan=1, rowspan=1,
        sticky=W+E+N+S, padx=10, pady=10)
image1 = Image.open("C:/Users/me/Pictures/house.jpg")
size = 64,64
image1.thumbnail(size, Image.ANTIALIAS)
photo1 = ImageTk.PhotoImage(image1) 
label1 = Label(image=photo1) 
label1.grid(row=0, column=10, columnspan=1, rowspan=1,
        sticky=N+E, padx=10, pady=10)

# end refactor method here

root.mainloop()   

誰かが画像が消える理由を説明し、画像を失うことなくリファクタリングできるような解決策を提案できますか?

リファクタリング後:

from Tkinter import Tk, Button, W, E, N, S, Label, Frame

from PIL import Image, ImageTk

def extractedMethod(root):
    root.geometry('400x400')
    runButton = Button(root, text="Run", bg='green', command=myCallback)
    runButton.grid(row=2, column=0, padx=10, pady=10)
    quitButton = Button(root, text="Quit", 
    command=root.quit)
    quitButton.grid(row=2, column=1, padx=10, pady=10)
    frame1 = Frame(width=200, height=200)
    frame1.grid(row=1, column=0, columnspan=1, rowspan=1, sticky=W + E + N + S, padx=10, pady=10)
    image1 = Image.open("C:/Users/me/Pictures/house.jpg")
    size = 64, 64
    image1.thumbnail(size, Image.ANTIALIAS)
    photo1 = ImageTk.PhotoImage(image1)
    label1 = Label(image=photo1)
    label1.grid(row=0, column=10, columnspan=1, rowspan=1, sticky=N + E, padx=10, pady=10)

def myCallback():
    pass

root = Tk()
extractedMethod(root)

root.mainloop()   

ありがとう。

4

2 に答える 2

0

1 つの解決策は、の先頭に 1 行を追加することですextractedMethod()

def extractedMethod(root):
    global photo1  # added
    ...

問題は、それ以外の場合photo1は、関数が戻るとすぐに破棄されるローカル変数であるため、関数内での参照が無効になることです。

ステートメントが参照カウントをインクリメントして、これが起こらないようにしていると考える人もいるかもしれませlabel1 = Label(image=photo1)んが、明らかにそのようには機能しません。私はこれを以前に見たことがありますが、個人的にはバグが原因ではないかと疑っていTkinterます...

于 2013-09-06T21:53:40.450 に答える