【问题标题】:Python custom popup with parent window带有父窗口的 Python 自定义弹出窗口
【发布时间】:2014-07-14 09:30:37
【问题描述】:

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

谁能解释我哪里出错了?

谢谢

詹姆斯

【问题讨论】:

    标签: python tkinter python-3.3


    【解决方案1】:

    如果你去应该可以:

    app = Screen(root)
    

    然后取出:

    aboutscreen = Tk()
    

    问题在于我认为有多个根或 Tk 实例。

    编辑:

    在邮件列表中找到这个:

    "Tkinter.Tk() 创建一个新的 Tcl 解释器。你确定你想要那个吗? 创建附加窗口的标准方法是 Tkinter.Toplevel()。

    PhotoImage 在默认(第一个)解释器中创建,然后查看 在标签的(第二个)解释器中。至少我会这么推断 来自

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

    "

    【讨论】:

    • 这是否仍将父窗口留在后台?
    • 您是否尝试使用额外的 Tk() 实例作为弹出窗口覆盖另一个窗口?在 Wx 等某些包中,有一个用于启动画面的内置类,这就是你的那种听起来像是在做的事情
    • 这是一个使用 Tk 的启动画面:code.activestate.com/recipes/577271-tkinter-splash-screen
    • 它不是一个启动画面,因为我仍然希望它有一个框架和标题栏,我无法理解的是为什么有图像或父窗口会阻止我的功能工作,如果我注释掉其中任何一个的代码(尽管没有根或图像)
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多