这是我目前拥有的代码格式:
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
?
答案 0 :(得分:8)
只要
,声明图像的位置并不重要Tk()
之后创建(第一种方法中的问题)如果您使用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__