Python RuntimeError:创建映像太早

Python RuntimeError:创建映像太早,python,tkinter,python-imaging-library,Python,Tkinter,Python Imaging Library,我正在尝试创建一个图像库,并在tkinter中调用该图像库中的图像。但这段代码给了我一个错误: 这是图像库文件img.py: from tkinter import * food_0001 = PhotoImage(file='food_0001.gif') food_0002 = PhotoImage(file='bg.gif') from tkinter import * import img window = Tk() window.title('image') canvas = Ca

我正在尝试创建一个图像库,并在
tkinter
中调用该图像库中的图像。但这段代码给了我一个错误:

这是图像库文件
img.py

from tkinter import *
food_0001 = PhotoImage(file='food_0001.gif')
food_0002 = PhotoImage(file='bg.gif')
from tkinter import *
import img

window = Tk()
window.title('image')
canvas = Canvas(window, width = 800, height = 800)
canvas.pack()
canvas.create_image(0,0, anchor=NW, image=food_0001)

window.mainloop()
此文件用于打开存储在
img.py
中的图像:

from tkinter import *
food_0001 = PhotoImage(file='food_0001.gif')
food_0002 = PhotoImage(file='bg.gif')
from tkinter import *
import img

window = Tk()
window.title('image')
canvas = Canvas(window, width = 800, height = 800)
canvas.pack()
canvas.create_image(0,0, anchor=NW, image=food_0001)

window.mainloop()

这是因为只有在创建
Tk()
之后才能调用
PhotoImage()

建议重写
img.py
以仅在需要时创建
PhotoImage()
。下面是一个示例方法:

from tkinter import *

imagelist = {
  'food_0001': ['food_0001.png', None],
  'food_0002': ['bg.png', None],
}

def get(name):
  if name in imagelist:
    if imagelist[name][1] is None:
      print('loading image:', name)
      imagelist[name][1] = PhotoImage(file=imagelist[name][0])
    return imagelist[name][1]
  return None
然后修改主程序以适应变化:

from tkinter import *
import img

window = Tk()
window.title('image')
canvas = Canvas(window, width=800, height=800)
canvas.pack()
canvas.create_image(0, 0, anchor='nw', image=img.get('food_0001'))

window.mainloop()

当然,还有很多其他的方法,这取决于你的想象力。

PhotoImage()
只能在创建
Tk()
@acw168之后调用。你能回答这个问题吗?