当前位置: 首页 > 面试题库 >

Python Tkinter PhotoImage

施晗日
2023-03-14
问题内容

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

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()这样的,它说,它无法找到图像Myimageclass 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. 初始化 创建它Tk()(第一种方法中的问题)
  2. 使用图像时图像 在可变范围内 (第二种方法中的问题)
  3. 图像对象不会 被垃圾收集 (另一个常见 陷阱)

如果您在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对象,以便在__init__完成操作时不会对其进行垃圾回收:

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


 类似资料:

相关阅读

相关文章

相关问答