ホームページ >バックエンド開発 >Python チュートリアル >クラスメソッド内で作成すると Tkinter イメージが消えるのはなぜですか?

クラスメソッド内で作成すると Tkinter イメージが消えるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 06:27:201020ブラウズ

Why Do Tkinter Images Disappear When Created Within Class Methods?

Tkinter の画像の表示に関する問題について

Python の人気のある GUI ライブラリである Tkinter では、関数内で作成された画像の表示に関して問題が発生することがあります。この動作は、Tkinter が画像参照などのローカル変数を処理する方法に由来します。

課題

画像を正常に表示する次のコードを考えてみましょう。

import tkinter

root = tkinter.Tk()
canvas = tkinter.Canvas(root)
canvas.grid(row = 0, column = 0)
photo = tkinter.PhotoImage(file = './test.gif')
canvas.create_image(0, 0, image=photo)
root.mainloop()

ただし、クラスメソッド内の画像を削除すると、画像が消えます。

import tkinter

class Test:
    def __init__(self, master):
        canvas = tkinter.Canvas(master)
        canvas.grid(row = 0, column = 0)
        photo = tkinter.PhotoImage(file = './test.gif')
        canvas.create_image(0, 0, image=photo)

root = tkinter.Tk()
test = Test(root)
root.mainloop()

解決策

この問題は、ローカル変数 photo が画像への参照を表すために発生します。クラス メソッドでは、メソッドの実行後に写真がスコープ外になるため、この参照は失われます。

これを解決するには、クラス インスタンス内に写真への永続的な参照を保存します:

import tkinter

class Test:
    def __init__(self, master):
        canvas = tkinter.Canvas(master)
        canvas.grid(row = 0, column = 0)
        self.photo = tkinter.PhotoImage(file = './test.gif')
        canvas.create_image(0, 0, image=self.photo)

root = tkinter.Tk()
test = Test(root)
root.mainloop()

参照を self.photo に保存すると、クラス インスタンスの存続期間中保持され、画像が表示されたままになります。

以上がクラスメソッド内で作成すると Tkinter イメージが消えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。