首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Tkinter PhotoImage

Python Tkinter PhotoImage
EN

Stack Overflow用户
提问于 2013-07-20 17:44:03
回答 1查看 23.4K关注 0票数 5

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

代码语言:javascript
复制
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()

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

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

代码语言:javascript
复制
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()中,它会说在class mycustomwindow中找不到图像Myimage

代码语言:javascript
复制
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()

我的代码结构有什么严重的错误吗?为了在class mycustomwindow中使用,我应该在哪里声明Myimage

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-20 18:24:06

在哪里声明图像并不重要,只要

  1. 您在初始化Tk()之后创建它(第一种方法中的问题)
  2. 当您使用图像时,它在变量作用域中(第二种方法中的问题)
  3. 图像对象未被垃圾收集(另一种common方法中的问题

如果在main()方法中定义图像,则必须将其设置为global

代码语言:javascript
复制
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()方法,使其自动成为全局方法:

代码语言:javascript
复制
class MyCustomWindow(Tkinter.Frame):
    # same as above

root = Tkinter.Tk()
image = Tkinter.PhotoImage(file='image.gif')
MyCustomWindow(root)
root.mainloop()

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

代码语言:javascript
复制
class MyCustomWindow(Tkinter.Frame):
    def __init__(self, parent):
        Tkinter.Frame.__init__(self, parent)
        self.image = Tkinter.PhotoImage(file='image.gif')
        Tkinter.Label(self, image=self.image).pack()
        self.pack(side='top')

def main():
    # same as above, but without creating the image
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17760871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档