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

如何在Tkinter Canvas的视频上方显示圆形?

问题解决:让圆形显示在视频上方

你的代码中,视频所在的my_label是作为Canvas的子组件直接pack进去的,在Tkinter的层级关系里,容器的子Widget会覆盖在Canvas自身的绘图元素之上,所以圆形会被视频Label挡住。

修改方案

把视频Label通过canvas.create_window嵌入为Canvas的一个绘图元素,这样圆形作为Canvas的绘图对象,就可以通过tag_raise调整到视频上方。

修改后的完整代码

import tkinter as tk, threading
from tkinter import *
import imageio
from PIL import Image, ImageTk
from random import *

video_name = "video.mp4" #This is your video file path
video = imageio.get_reader(video_name)

def stream(label):
    for image in video.iter_data():
        frame_image = ImageTk.PhotoImage(Image.fromarray(image))
        label.config(image=frame_image)
        label.image = frame_image

def circle():
    global circ
    x = randint(0, 299)
    y = randint(0, 299)
    diameter = randint(10, 100)
    circ = canvas.create_oval(x, y, x + diameter, y + diameter, tags="circle")
    # 把圆形提到视频窗口元素的上方
    canvas.tag_raise(circ, "video_window")

if __name__ == "__main__":
    root = tk.Tk()
    canvas = Canvas(root, bg="green")
    canvas.pack(expand=True, fill=BOTH)
    
    my_label = tk.Label(canvas)
    # 用create_window把Label嵌入Canvas,指定tag方便后续层级调整
    canvas.create_window(0, 0, anchor=NW, window=my_label, tags="video_window")
    
    b = Button(canvas, text="Circle", command=circle)
    canvas.create_window(0, 0, anchor=SW, window=b) # 按钮也嵌入Canvas,避免被遮挡
    
    thread = threading.Thread(target=stream, args=(my_label,))
    thread.daemon = True
    thread.start()
    root.mainloop()

关键修改点

  • 替换my_label.pack()为canvas.create_window(...),将Label转为Canvas的绘图元素
  • 在circle函数中,通过canvas.tag_raise(circ, "video_window")指定把圆形提到视频窗口元素上方
  • 按钮也改用create_window嵌入Canvas,避免被视频Label遮挡

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:20:28