1

作成しているGUIの背景としてjpg画像を表示しようとしています。

私はそれを単一の方法で動作させることができます:

from Tkinter import *
from PIL import Image, ImageTk

class MakeGUI(object):
    master = None
    w = None

    def __init__(self):
        self.canvasSizeY = 400 #height
        self.canvasSizeX = 640 #width

    def setupCanvas(self):
        """
        preps the canvas for drawing.
        """
        self.master = Tk()
        self.w = Canvas(self.master, width=self.canvasSizeX, height=self.canvasSizeY)
        self.w.config(bg='white')
        image = Image.open("background.jpg")
        photo = ImageTk.PhotoImage(image)
        self.w.create_image(0,0, image=photo, anchor=NW)
        self.w.pack()
        mainloop()

def main():
    makeGUI = MakeGUI()
    makeGUI.setupCanvas()

if __name__ == '__main__':
    main()

しかし、ある方法でキャンバスを作成し、別の方法でキャンバスを表示しようとすると、jpgは表示されません(テストしているときは、このアプローチを使用してテキストと長方形を作成して表示しました):

from Tkinter import *
from PIL import Image, ImageTk

class MakeGUI(object):
    master = None
    w = None

    def __init__(self):
        self.canvasSizeY = 400 #height
        self.canvasSizeX = 640 #width

    def setupCanvas(self):
        """
        preps the canvas for drawing.
        """
        self.master = Tk()
        self.w = Canvas(self.master, width=self.canvasSizeX, height=self.canvasSizeY)
        self.w.config(bg='white')
        image = Image.open("background.jpg")
        photo = ImageTk.PhotoImage(image)
        self.w.create_image(0,0, image=photo, anchor=NW)

    def showImage(self):
        """
       pushes the image to the screen
       """
        self.w.pack()
        self.w.mainloop()

def main():
    makeGUI = MakeGUI()
    makeGUI.setupCanvas()

if __name__ == '__main__':
    main()

GUIを動的に使用して、編集中にテキストを表示したいので、ビルドに踏み込む前に、何が間違っているのかを理解したいと思っています...

4

1 に答える 1

2

最も明らかな問題は、2 番目のケースでは決して を呼び出していないことshowImageです。その関数を呼び出した後でも、おそらく画像は表示されません。イメージへの参照がない場合、イメージはガベージ コレクションされます。キャンバスに追加しているので参照があるように見えるかもしれませんが、それだけでは十分ではありません。

次のようなことをする必要があります:

self.photo = ImageTk.PhotoImage(image)

mainloop最後に、 out ofへの電話を取ることをお勧めしますshowImagemainloop常に 1 回だけ呼び出す必要があるため、最も一般的には、プログラムのコードの最後の行、またはメイン関数のコードの最後の行です。

Tkinter アプリケーションを作成するより一般的な方法は、メイン アプリケーションを汎用オブジェクトにするのではなく、Tkオブジェクトまたはオブジェクトのいずれかをサブクラス化することです。Frame例えば:

class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        ...
        self.setupCanvas(...)
        ...
if __name__ == "__main__":
    app = MyApp()
    app.mainloop()
于 2012-12-08T13:47:22.230 に答える