我试图制作一个自定义弹出窗口作为我正在制作的程序的屏幕,但是当我在调用弹出窗口之前尝试另外一个窗口时,我得到一个tcl消息说图像不存在。我记录的是使用python 3.3.4
我的代码的完整摘录是:
#!python3
from tkinter import *
import PIL.ImageTk
import os
__version__ = "part number"
class Screen():
def __init__(self):
aboutscreen = Tk()
aboutscreen.title("About")
aboutscreen.photoimg = PIL.ImageTk.PhotoImage(file="Logo.bmp")
Label(aboutscreen, image=aboutscreen.photoimg).pack()
Label(aboutscreen, text = "company name", width = 25, font = ("ariel",16)).pack()
Label(aboutscreen, text = "program name", width = 30, font = ("ariel",12)).pack()
Label(aboutscreen, text = "Part Number: " + __version__, width = 30, font = ("ariel",12)).pack()
Label(aboutscreen, text = "Copyright company name", width = 30, font = ("ariel",12)).pack()
while 1:
try: aboutscreen.update() #keep update window updated until destroyed
except: break #break loop when destroyed
if __name__ == "__main__":
root = Tk()
app = Screen()
这段代码给出了错误信息:
line 15, in __init__
Label(aboutscreen, image=aboutscreen.photoimg).pack()
File "C:\Python33\lib\tkinter\__init__.py", line 2607, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
File "C:\Python33\lib\tkinter\__init__.py", line 2086, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
但是如果我注释掉root = Tk()行就可以了。
任何人都可以解释我哪里出错了吗?
由于
詹姆斯
答案 0 :(得分:0)
如果你去,它应该有效:
app = Screen(root)
并取出:
aboutscreen = Tk()
问题是我想有多个root或Tk实例。
编辑:
在邮件列表中找到了这个:
" Tkinter.Tk()创建一个新的Tcl解释器。你确定要的吗?该 创建附加窗口的标准方法是Tkinter.Toplevel()。
PhotoImage在默认(第一个)解释器中创建,然后查看 在Label(第二)翻译中。至少这是我推断的 从
class Image:
"""Base class for images."""
_last_id = 0
def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
self.name = None
if not master:
master = _default_root
if not master:
raise RuntimeError, 'Too early to create image'
self.tk = master.tk
在Tkinter源码中,这也使得你可以避免使用 通过指定显式主
的问题def showPicture(imageFilename):
root = Tk()
# ...
imageObject = PhotoImage(file=imageFilename, master=root)
# ...
"