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

如何在Tkinter中让文本及其他元素显示在视频上方?

如何在Tkinter中让文本及其他元素显示在视频上方?

嘿,这个问题我之前也碰到过!核心问题出在组件的层级和归属关系上,咱们一步步来解决:

你现在的代码里,视频标签lbl和画布canvas是两个平行的顶层组件,而且你先调用了lbl.pack(),之后才canvas.pack()——这就导致视频标签把整个画布都盖住了,画布上的文本自然就看不到啦。

解决思路很简单:把视频标签作为画布的子组件,让画布成为它的容器,这样画布上绘制的元素就能天然地叠在视频上方。下面是修改后的完整代码:

import tkinter as tk
from tkvideo import tkvideo

root = tk.Tk()

root.geometry("957x555")
root.configure(bg = "#FFFFFF")
root.attributes('-alpha', 0.8)

canvas = tk.Canvas(
    root,
    bg="#FFFFFF",
    height=555,
    width=957,
    bd=0,
    highlightthickness=0,
    relief="ridge"
)
canvas.place(x = 0, y = 0)

# 把视频标签的父组件设置为canvas,让它成为画布的子元素
lbl = tk.Label(canvas)
# 用place让视频铺满整个画布
lbl.place(x=0, y=0, width=957, height=555)

player = tkvideo("Files/0001-1000.mp4", lbl, loop=1, size=(957,555))
player.play()

# 先放视频,再绘制画布上的元素,确保它们在视频上方
canvas.create_rectangle(
    52.976036673451745,
    41.0,
    69.0,
    512.0,
    fill="#FFFFFF",
    outline="")

canvas.create_rectangle(
    854.9753520069789,
    24.0,
    871.0,
    508.0,
    fill="#FFFFFF",
    outline="")

canvas.create_text(
    247.0,
    250.0,
    anchor="nw",
    text="Test",
    fill="#FFFFFF",
    font=("Inter Medium", 24 * -1)
)

root.resizable(False, False)
root.mainloop()

我来给你拆解下关键改动:

  • lbl = tk.Label(canvas):把视频标签绑定到画布上,这样它就属于画布的一部分,不再是独立的顶层组件。
  • lbl.place(x=0, y=0, width=957, height=555):精确控制视频标签的位置,让它完全覆盖画布区域,作为背景。
  • 移除了lbl.pack()和canvas.pack(),改用canvas.place(x=0,y=0)直接把画布铺满窗口(你原来的代码里也用了place,这里保持一致更稳妥)。
  • 调整了绘制顺序:先创建视频标签并播放,再在画布上绘制矩形和文本——这样画布上的元素会自动处于视频标签的上层。

如果之后你还要添加其他元素,只要是在canvas上用create_xxx方法创建的,都会默认显示在视频上方。要是遇到层级混乱的情况,还可以用canvas.tag_raise(元素ID)来手动把某个元素提到最上层哦。

备注:内容来源于stack exchange,提问作者Venexs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 12:33:08