You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter技术疑问:图片置于Tk对象可显示,置于Frame对象为何无法显示?

Tkinter Frame承载图片Label无法显示的解决办法

问题场景

我遇到一个Tkinter的问题:当承载图片的Label放在Frame里时,窗口只显示灰色,图片加载失败;但直接把Label放在Tk主窗口里,图片就能正常显示。

无法正常显示的代码:

import tkinter
from tkinter import ttk
import screen  # 自定义本地模块

window = tkinter.Tk()
frame = ttk.Frame(window, width=1920, height=1080)

image = screen.get_photoimage("img/background.png", contain_size=(1920, 1080))
label = tkinter.Label(frame, image=image)
label.place(x=0, y=0, relwidth=1, relheight=1)

window.mainloop()

注:screen.get_photoimage()用于生成指定尺寸的PhotoImage对象。

能正常显示的代码:

import tkinter
import screen  # 自定义本地模块

window = tkinter.Tk()

image = screen.get_photoimage("img/background.png", contain_size=(1920, 1080))
label = tkinter.Label(window, image=image)
label.place(x=0, y=0, relwidth=1, relheight=1)

window.mainloop()

项目需求是要销毁包含图片和其他组件的Frame但保持主窗口打开,所以不能直接把Label放在主窗口,希望得到解决方法,也可以替换为Canvas等组件。


问题原因及解决办法

问题核心:你创建的Frame没有被添加到主窗口的布局中。Tkinter的组件必须通过布局管理器(pack()/grid()/place())放置,否则不会在窗口中显示,自然里面的Label也看不到。

修改后的可行代码:

import tkinter
from tkinter import ttk
import screen  # 自定义本地模块

window = tkinter.Tk()
frame = ttk.Frame(window, width=1920, height=1080)
# 将Frame布局到主窗口,占满整个窗口
frame.place(x=0, y=0, relwidth=1, relheight=1)
# 也可以用pack方式:frame.pack(fill="both", expand=True)

image = screen.get_photoimage("img/background.png", contain_size=(1920, 1080))
label = tkinter.Label(frame, image=image)
label.place(x=0, y=0, relwidth=1, relheight=1)

window.mainloop()

额外说明

  1. 因为Label用了relwidth=1和relheight=1,所以必须让Frame先占满主窗口,否则Label的相对尺寸只会基于Frame的实际显示大小。
  2. 后续要销毁Frame时,直接调用frame.destroy()即可,主窗口会保持打开状态,完全满足需求。
  3. 如果想用Canvas替代Frame,逻辑一致:创建Canvas后先布局到主窗口,再在Canvas上放置图片,销毁方式同样是调用canvas.destroy()。

内容的提问来源于stack exchange,提问作者revsuine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:10:56