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

