tkinter写一个视频截屏工具

效果

在这里插入图片描述

python代码

#coding=utf-8
import cv2,os
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk,Image


class Display():
    def __init__(self,wide=800, height=500,save_path="result",fps=70):
        self.W, self.H = wide, height
        self.fps=fps
        self.save_path = save_path

        self.button_w, self.button_h = 100, 30
        #button stretch
        self.button_hstretch=10
        self.button_wstretch = 10

        self.video_cap=None
        self.frame=None

        self._init_root()

    def run(self):
        self.root.mainloop()

	# Initialization window
    def _init_root(self,):
        #creat window
        self.root=tk.Tk()
        self.root.title("video shot")
        self.root.config(background="white")
        self.root.geometry(str(self.W) + "x" + str(self.H) + "-500-200")
        self.root.resizable(0, 0)
        #self.root.iconbitmap("./image/icon.ico")
        self.root.attributes("-alpha", 0.95)

        """left area"""
        # creat video area
        self.video_w, self.video_h= int(3 / 4 * self.W) - 1, int(self.H) - 2
        self.video_area = tk.Label(self.root, bg="black", fg="green", cursor="cross")
        self.video_area.place(x=1, y=1, w=self.video_w, h=self.video_h - 35)

        #state area
        self.text_area_frame = tk.Label(self.root, text="----------------")
        self.text_area_frame.place(x=1, y=self.video_h - 32, w=120, h=30)
        self.text_area_info = tk.Label(self.root, text="----------------")
        self.text_area_info.place(x=130, y=self.video_h - 32, w=self.video_w-130, h=30)

        """right area"""
        right_x, right_y = 7 / 8 * self.W - 1 / 2 * self.button_w, 3 / 11 * self.H

        #button
        tk.Button(self.root, text="选择文件", relief="groove", command=self._select_video)\
            .place(x=right_x, y= right_y-20, w=self.button_w, h=self.button_h)
        tk.Button(self.root, text="播放", relief="groove", command=self._play)\
            .place(x=right_x, y= right_y+2*self.button_h+self.button_hstretch, w=self.button_w, h=self.button_h)
        tk.Button(self.root, text=" 截屏", relief="groove", command=self._screen_shot)\
            .place(x=right_x, y= right_y+4*(self.button_h+self.button_hstretch), w=self.button_w, h=self.button_h)
        tk.Button(self.root, text="关闭", relief="groove", command=self._exit)\
            .place(x=right_x, y= right_y+6*(self.button_h+self.button_hstretch), w=self.button_w, h=self.button_h)

    # select video
    def _select_video(self):
        self.video_file=filedialog.askopenfilename()

    # play video
    def _play(self):
        self.video_cap = cv2.VideoCapture(self.video_file)
        frame_count=self.video_cap.get(cv2.CAP_PROP_FRAME_COUNT)

        video_source=self._get_frame(self.video_cap,self.fps)
        self.count=0
        for self.frame in video_source:
            img=self._convert_img(self.frame, self.video_w)
            self.video_area.config(image=img)
            self.video_area.update()

            self.text_area_frame.config(text='frame: ' + str(self.count) + " /:" + str(frame_count))
            self.text_area_frame.update()
            self.count+=1

        self.video_cap.release()

    # save frame
    def _screen_shot(self):
        os.makedirs(self.save_path, exist_ok=True)
        name = self.video_file.split(".")[0].split("/") [-1]   # os.sep is incorrect

        cv2.imwrite(os.path.join(self.save_path, name + "_" + str(self.count) + '.bmp'), self.frame)
        self.text_area_info.config(text='save frame to: ' +
                                         os.path.join(self.save_path, name + "_" + str(self.count) + '.bmp'))
        self.text_area_info.update()

    # get frame from video
    def _get_frame(self,video_cap, fps=70):
        while 1:
            ret, frame = video_cap.read()
            if cv2.waitKey(int(1000 / fps)) == 27 or not ret:   ##
                break
            yield frame

    # convert frame to tk img
    def _convert_img(self,img,video_w):
        h, w, _ = img.shape
        wc ,hc= video_w,int(h * (video_w / w))

        img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
        current_image = Image.fromarray(img, "RGB").resize((wc, hc), Image.ANTIALIAS)
        img = ImageTk.PhotoImage(image=current_image)

        return img

    def _exit(self):
        self.video_cap.release()
        exit()


if __name__=="__main__":
    ds=Display()
    ds.run()

附1.0版本,按一定帧间隔保存


def getPic(file, interval, save_path="result", fps=70):
    """
    视屏截图
    :param file:
    :param interval:按指定间隔保存
    :param save_path:
    :param fps:
    """
    os.makedirs(save_path,exist_ok=True)
    name=file.split(".")[0]

    video = cv2.VideoCapture(file)
    cv2.namedWindow(file, 0)
    count=0
    while 1:
        ret, frame = video.read()
        if cv2.waitKey(int(1000/fps)) == 27 or not ret:   # "ESC":27,“esc”退出
            break

        if count % interval == 0:
            cv2.imwrite(os.path.join(save_path ,name+"_"+ str(count//interval) + '.bmp'), frame)
            cv2.putText(frame, "cut"+str(count//interval), (123, 456),
                        cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
        cv2.imshow(file, frame)

        count+=1

    video.release()
    cv2.destroyAllWindows()


if __name__=="__main__":
    getPic(file="view1.mp4", interval=50, fps=70)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Tkinter一个 Python 的图形用户界面(GUI)库,可以用来开发扑克牌游戏。要一个扑克牌游戏,你需要了解 Tkinter 的基本知识,包括创建窗口、放置按钮和图片等元素。 下面是一个简单的例子,演示了如何在 Tkinter 创建一个扑克牌游戏: ``` import tkinter as tk class PokerGame(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.title("扑克牌游戏") self.geometry("400x400") self.resizable(False, False) self.create_widgets() def create_widgets(self): label = tk.Label(self, text="这是一张扑克牌", font=("Arial", 16)) label.pack() image = tk.PhotoImage(file="card.png") image_label = tk.Label(self, image=image) image_label.pack() if __name__ == "__main__": app = PokerGame() app.mainloop() ``` 这个例子创建了一个带有文字和图像的窗口,你可以根据需要添加更多元素来完善你的扑克牌游戏。 ### 回答2: 扑克牌是一种常见的纸牌游戏,可以使用Python编程语言tkinter库来实现一个简单的扑克牌游戏。下面是一个大致的实现思路: 首先,可以创建一个窗口和画布来进行游戏界面的展示。使用tkinter创建游戏窗口,并在窗口上添加画布组件,画布用来展示扑克牌的图像。 其次,可以创建一个Card类来表示一张扑克牌。Card类包含属性(如花色和牌面值)和方法(如绘制和翻牌)来处理扑克牌的操作。 然后,可以创建一个Deck类来表示一副扑克牌。Deck类包含一个Card对象列表,用来表示一副完整的扑克牌。Deck类包含方法来洗牌、发牌和收回牌等操作。 接着,可以创建一个Player类来表示玩家。Player类可以包含一个手牌列表和方法来处理玩家的操作,如抽牌、出牌和判断牌面等。 最后,可以创建一个Game类来控制整个游戏的流程。Game类可以包含一个Deck对象、若干个Player对象和一些游戏逻辑的方法,如开始游戏、判断胜负等。 在游戏界面上,可以使用画布来展示扑克牌的图像,并通过按钮或键盘事件来触发玩家的动作。玩家的手牌可以在游戏界面上显示,根据游戏规则判断胜负并进行游戏结果的展示。 以上是一个扑克牌游戏的大致实现思路,可以根据实际需求和具体规则进行具体的编码和设计。通过利用tkinter库和相关的类和方法,我们可以实现一个基本的扑克牌游戏。 ### 回答3: 扑克牌是一种非常经典和有趣的牌类游戏。TkinterPython编程语言的一个GUI库,提供了创建图形界面的功能。 要使用Tkinter一个扑克牌游戏,首先需要了解扑克牌的规则和玩法。然后,我们可以使用Tkinter创建一个窗口,用于显示游戏界面。在窗口,我们可以布置一些扑克牌的图像和按钮。 游戏开始时,可以通过按钮或者其他方式进行洗牌,并将扑克牌发给玩家和电脑。玩家可以选择要保留的牌,然后再次发牌。在游戏的过程,可以通过按钮实现玩家和电脑的操作,如选择出牌、跟牌、抢地主等。 为了实现这个游戏,我们需要使用Tkinter提供的组件和功能来构建游戏界面。可以使用Canvas组件来显示扑克牌的图像,使用Button组件来实现按钮的点击操作,使用Label组件显示分数和游戏信息等。 在游戏的过程,可以使用Tkinter提供的事件处理机制来处理按钮的点击事件和鼠标的点击事件。通过编逻辑代码,可以实现扑克牌的洗牌、发牌、比较大小、计算得分等功能。 总结起来,使用Tkinter一个扑克牌游戏需要实现以下几个步骤:了解扑克牌的规则和玩法、创建游戏窗口、布置游戏界面、编按钮和事件处理代码、实现游戏的逻辑功能。 通过以上步骤,我们可以使用Tkinter一个简单的扑克牌游戏,并且随着对Tkinter的进一步学习和掌握,可以添加更多的功能和特性,使游戏变得更加完善和精彩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值