【问题标题】:How to go frame by frame on mouse click in tkinter (Python3.x)?如何在tkinter(Python3.x)中单击鼠标逐帧进行?
【发布时间】:2019-08-06 05:41:46
【问题描述】:

我有一些关于堆栈溢出的代码,这些代码已经放在一起。它播放视频并记录窗口中的点击位置。我希望它在每次点击后逐帧前进。我不确定如何开始。

video_name = input_file()
video = imageio.get_reader(video_name)

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


if __name__ == "__main__":
    def leftClick(event):
        x = root.winfo_pointerx() - root.winfo_rootx()
        y = root.winfo_pointery()- root.winfo_rooty()
        print(x, y)
    root = tk.Tk()
    my_label = tk.Label(root)
    my_label.bind("<Button-1>", leftClick)
    my_label.bind("<Button-3>", rightClick)
    my_label.pack()
    thread = threading.Thread(target=stream, args=(my_label,))
    thread.daemon = 1
    thread.start()
    root.mainloop()

感谢您对我的任何建议。

【问题讨论】:

    标签: python video tkinter onclick frame


    【解决方案1】:

    您应该使用video.get_data(...) 来加载帧,而不是使用for 循环。此外,您不需要使用thread 从视频中读取帧,使用点击事件处理程序。以下是您的代码的修改版本作为示例:

    frame_index = 0 # current displayed frame index in the video file
    
    def stream(label, offset=0):
        global frame_index
        try:
            # read a frame image from video file
            image = video.get_data(frame_index+offset)
            # convert the image to tkinter supported format
            image_frame = Image.fromarray(image)
            frame_image = ImageTk.PhotoImage(image_frame)
            label.config(image=frame_image)
            label.image = frame_image
            # update frame_index if image is loaded successfully
            frame_index += offset
        except Exception as ex:
            print('Error loading frame:', ex)
    
    if __name__ == "__main__":
        video_name = input_file()
        video = imageio.get_reader(video_name)
        root = tk.Tk()
        my_label = tk.Label(root)
        my_label.bind("<Button-1>", lambda e: stream(my_label, +1))
        my_label.bind("<Button-3>", lambda e: stream(my_label, -1))
        my_label.pack()
        stream(my_label) # load first frame
        root.mainloop()
        video.close() # close the reader
    

    请注意,鼠标左键用于显示视频中的下一张图片,鼠标右键点击用于显示文件中的上一张图片。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2020-03-29
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多