Python Tkinter PhotoImage

时间:2013-07-20 09:44:03

标签: python class tkinter

这是我目前拥有的代码格式:

import Tkinter as tk

class mycustomwidow:
    def __init__(self,parent,......)
        ......
        ......
        tk.Label(parent,image=Myimage)
        tk.pack(side='top')

def main():
    root=tk.Tk()
    mycustomwindow(root)
    root.mainlopp()

if __name__ == '__main__':
    main()

我的问题是:我应该在哪里声明我在课堂Myimage中使用的mycustomwindow照片?

如果我将Myimage=tk.PhotoImage(data='....')放在下面root=tk.Tk()之前,它会给我too early to create image错误,因为我们无法在根窗口之前创建图像。

import Tkinter as tk
Myimage=tk.PhotoImage(data='....') 
class mycustomwidow:
    def __init__(self,parent,......)
        ......
        ......
        tk.Label(parent,image=Myimage)
        tk.pack(side='top')

def main():
    root=tk.Tk()
    mycustomwindow(root)
    root.mainlopp()

if __name__ == '__main__':
    main()

如果我将Myimage=tk.PhotoImage(data='....')放在main()这样的函数中,则表示找不到Myimage中的图片class mycustomwindow

import Tkinter as tk

class mycustomwidow:
    def __init__(self,parent,......)
        ......
        ......
        tk.Label(parent,image=Myimage)
        tk.pack(side='top')

def main():
    root=tk.Tk()
    Myimage=tk.PhotoImage(data='....')
    mycustomwindow(root)
    root.mainlopp()

if __name__ == '__main__':
    main()

我的代码结构有什么严重错误吗?我应该在哪里声明Myimage,以便可以在class mycustomwindow

中使用它

1 个答案:

答案 0 :(得分:8)

只要

,声明图像的位置并不重要
  1. 在初始化Tk()之后创建(第一种方法中的问题)
  2. 当你使用它时,图像是在变量范围(第二种方法中的问题)
  3. 图片对象没有垃圾收集(另一个common pitfall
  4. 如果您使用main()方法定义图片,则必须将其设为global

    class MyCustomWindow(Tkinter.Frame):
        def __init__(self, parent):
            Tkinter.Frame.__init__(self, parent)
            Tkinter.Label(self, image=image).pack()
            self.pack(side='top')
    
    def main():
        root = Tkinter.Tk()
        global image # make image known in global scope
        image = Tkinter.PhotoImage(file='image.gif')
        MyCustomWindow(root)
        root.mainloop()
    
    if __name__ == "__main__":
        main()
    

    或者,您可以完全放弃main()方法,将其自动设为全局:

    class MyCustomWindow(Tkinter.Frame):
        # same as above
    
    root = Tkinter.Tk()
    image = Tkinter.PhotoImage(file='image.gif')
    MyCustomWindow(root)
    root.mainloop()
    

    或者,在__init__方法中声明图像,但请确保使用self关键字将其绑定到Frame对象,以便{{1}时不会对其进行垃圾回收完成:

    __init__