带有父窗口的Python自定义弹出窗口

时间:2014-07-14 09:30:38

标签: python tkinter python-3.3

我试图制作一个自定义弹出窗口作为我正在制作的程序的屏幕,但是当我在调用弹出窗口之前尝试另外一个窗口时,我得到一个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()行就可以了。

任何人都可以解释我哪里出错了吗?

由于

詹姆斯

1 个答案:

答案 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)
    # ...

"