【问题标题】:Do tkinter's PhotoImages really require a root window? Why?tkinter 的 PhotoImages 真的需要根窗口吗?为什么?
【发布时间】:2021-08-11 15:51:17
【问题描述】:

我正在尝试创建一个小类来表示有关我希望软件处理的各种 GIF 的重要信息。这是我的代码:

from PIL import Image
import tkinter as tk

class ListifiedGif:
    """Class containing list of frames and number of frames from GIF."""
    def __init__(self, filename):
        gif = Image.open(filename)
        self.frame_count = gif.n_frames
        self.frame_list = [tk.PhotoImage(file = filename,
                                         format = f'gif -index {i}')
                                         for i in range(gif.n_frames)]

当我在文件末尾插入以下内容时,出现错误。

testimg = ListifiedGif('E:\\Development\\desktop\\img\\walking_negative.gif')

print(testimg.frame_count)
print(testimg.frame_list)

...这是错误:

Traceback (most recent call last):
  File "<module1>", line 13, in <module>
  File "<module1>", line 9, in __init__
  File "<module1>", line 9, in <listcomp>
  File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 4064, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 3997, in __init__
    master = _get_default_root('create image')
  File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 297, in _get_default_root
    raise RuntimeError(f"Too early to {what}: no default root window")
RuntimeError: Too early to create image: no default root window

为什么必须声明根窗口才能创建图像?有没有办法解决这个问题,以便我可以简单地返回帧列表(作为 tkinter 的一系列 PhotoImages),而不必担心将使用图像的窗口看起来像什么?

提前感谢您的宝贵时间。

【问题讨论】:

  • 您可以使用&lt;tk.Tk&gt;.withdraw() 隐藏tk.Tk(),然后使用&lt;tk.Tk&gt;.deiconify() 显示它
  • 这真的很有趣。谢谢你提到这一点。我可能会觉得它很有用。

标签: python tkinter photoimage


【解决方案1】:

为什么必须声明根窗口才能创建图像?

因为在创建图像之前需要初始化底层的 tcl/tk 解释器,而初始化是根窗口的创建。

有没有办法解决这个问题

没有。您必须先创建一个根窗口,然后才能使用 tkinter 创建图像。

【讨论】:

  • 感谢您的洞察力。然后,我收集到,如果不创建根窗口,就不可能执行该初始化。这太糟糕了;我认为这意味着我必须想办法在读入信息后修改那个根窗口。
  • @MattFunke:“我必须想办法在读入信息后修改根窗口。” - 这应该不难。创建窗口后,您无需执行任何特殊操作即可更新窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多