3

PythonとTkinterを学ぼうとしています。以下のサンプルコードは、画面に2つのウィンドウ、いくつかのボタン、および画像といくつかの線が描かれたキャンバスを配置することを目的としています。

ウィンドウとボタンは問題なく表示されますが、キャンバスの画像もキャンバスの線も表示されません。キャンバスを表示するために何が必要かを理解するために、いくつかの助けをいただければ幸いです。

from Tkinter import *
import Image, ImageTk

class App:

    def __init__(self, master):

    def scrollWheelClicked(event):
        print "Wheel wheeled"

    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, text = "QUIT", fg="red", command=frame.quit)
    self.button.pack(side=LEFT)

    self.hi_there = Button(frame, text="Hello", command=self.say_hi)
    self.hi_there.pack(side=LEFT)

    top = Toplevel()
    canvas = Canvas(master=top, width=600, height=600)

    image = Image.open("c:\lena.jpg")
    photo = ImageTk.PhotoImage(image)
    item = canvas.create_image(0, 0, image=photo)

    canvas.create_line(0, 0, 200, 100)
    canvas.create_line(0, 100, 200, 0, fill="red", dash=(4, 4))
    canvas.create_rectangle(50, 25, 150, 75, fill="blue")

    canvas.pack

    testBtn = Button(top, text = "test button")
    testBtn.pack()

def say_hi(self):
    print "hi there everyone!"

root = Tk()
app = App(root)
root.mainloop()
4

2 に答える 2

7

私はこの問題を解決しました:

self.photo = ImageTk.PhotoImage(image)
self.item = canvas.create_image(0, 0, image=self.photo)

ImageTkインスタンスへの参照はどこかに保存する必要があります。そうしないと、App.__init__()メソッドが返されるときにガベージコレクションが行われ、キャンバスはそれを表示できなくなります。(Tkinterは画像への参照を保持しません。)

それへの参照を保持する1つの方法は、それを「self.photo」または「photo」という名前の変数に格納するか、ほとんどのプログラマーが定数変数(「TEN =10」のように変化しない変数)に対して行うようにすることです。 )、'PHOTO = PhotoImage(...)'なぜ...私にはわかりません。モジュール'gc'(Python 3のガベージコレクションモジュール、組み込み)をインポートしてgc.disable()を実行しても機能しません。(試してみたい場合:https ://docs.python.org/3/library/gc.html )

于 2010-10-27T19:45:18.220 に答える
4

canvas オブジェクトで pack を呼び出すときは括弧が必要です。それ以外の場合は、関数オブジェクトを呼び出しているのではなく、参照しているだけです。

例えば:

canvas.pack()

もう一つの例:

>>>def hello():
...    print "hello world"
...    return

>>>hello 関数参照を返します (関数 hello at 0x....)

>>>hello()実際に hello 関数を呼び出します

于 2010-02-08T18:55:24.567 に答える