如何在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
相关产品推荐
相关产品推荐

