为什么tkinter canvas在类中使用时不会更新

时间:2014-07-13 20:01:42

标签: python oop tkinter

我正在写一个小程序,我想在画布上画一些东西。这段代码适合我;

import tkinter as tk
from PIL import Image, ImageTk
from l_systems import Lindenmayer

if __name__ == "__main__":

    root = tk.Tk()
    root.title("Draw Shapes with L-Equations")

    cv = tk.Canvas(width=600, height=600, bg='white')
    cv.pack()

    image1 = Image.new("RGB", (600, 600), (255,255,255))
    koch = Lindenmayer(image1)

    koch.init(
        iterations = 6,
        angle      = 25,
        axiom      = "---X",
        rules      = {"X":"2F-[1[X]+3X]4+F[3+FX]-X", "F":"FF"},
        constants   = "X") # This creates a drawing on PIL image

    # Canvas.create_image expects a PhotoImage
    photo = ImageTk.PhotoImage(image1) 
    cv.create_image((300,300), image=photo)


    root.mainloop()

但是,我想将我的tkinter应用程序组织为一个类,因此我尝试了这个代码,

class main(tk.Frame):

    w = 600
    h = 600

    def __init__(self,parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.parent = parent
        self.cv = tk.Canvas(width=self.w, height=self.h, bg='white')
        self.cv.pack()

        self.render_image()

    def render_image(self):
        image1 = Image.new("RGB", (self.w, self.h), (255,255,255))
        koch = Lindenmayer(image1)

        koch.init(
            iterations = 6,
            angle      = 25,
            axiom      = "---X",
            rules      = {"X":"2F-[1[X]+3X]4+F[3+FX]-X", "F":"FF"},
            constants   = "X"
        )

        photo = ImageTk.PhotoImage(image1)
        self.cv.create_image((self.w/2,self.h/2), image=photo)

if __name__ == "__main__":

    root = tk.Tk()
    root.title("Draw Shapes with L-Equations")
    app = main(root).pack()
    root.mainloop()

在第二种情况下,我在画布上看不到任何图画。它只是一个白色背景。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

PhotoImage可能在类和函数中存在问题。 Garbage collector可以将其从内存中删除。


编辑:

我可以检查一下(因为我必须Lindenmayer模块) 但你的班级可以这样看:

几乎所有东西都在课堂上。

类名通常应使用CapWords约定。 - 见PEP 8 -- Style Guide for Python Code。事件SO使用该规则识别代码中的类并使用浅蓝色。

import tkinter as tk
from PIL import Image, ImageTk
from l_systems import Lindenmayer

class Main(tk.Frame):

    def __init__(self,parent, *args, **kwargs):

        tk.Frame.__init__(self, parent, *args, **kwargs)

        self.w = 600
        self.h = 600

        self.parent = parent

        self.parent.title("Draw Shapes with L-Equations")

        self.cv = tk.Canvas(width=self.w, height=self.h, bg='white')
        self.cv.pack()

        self.render_image()

        self.parent.pack()

    def render_image(self):

        image1 = Image.new("RGB", (self.w, self.h), (255,255,255))
        koch = Lindenmayer(image1)

        koch.init(
            iterations = 6,
            angle      = 25,
            axiom      = "---X",
            rules      = {"X":"2F-[1[X]+3X]4+F[3+FX]-X", "F":"FF"},
            constants   = "X"
        )

        self.photo = ImageTk.PhotoImage(image1)
        self.cv.create_image((self.w/2,self.h/2), image=self.photo)

    def run(self):
        self.parent.mainloop()

if __name__ == "__main__":

    Main(tk.Tk()).run()