Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

【ChatGPT使用】Pythonにてストップウォッチとビデオプレイヤーを作ってみた

※なにか気になる点がありましたらコメント欄にご記入ください。

【目次】

1.はじめに

ちょっと思い付きで「作ってみたいなー」というノリでコードを書いてみました。
最近は特にコーディングに関しては、ChatGPT3.5の力を借りることが多いです。

覚え書として残しておこうと思います。

Pythonはver.3.12を使用しましたが、以前のバージョンでも動くと思います。
PC環境はWindows11 64bitです。

写真1 制作したプログラムの画面

2.ソースコード

作ったものは2つです。

2.1 ストップウォッチ

画面上側に時間を表示し、下側に操作用のボタンを配置しています。(PythonTkinterというライブラリではウィジェットと呼ぶらしいです)

それぞれのボタンを押すごとにそれに対応した関数が呼び出され、フラグ(self.is_runningなど)が’True’か’False’かを切り替えています。

表示に関する関数(update_time())にて、フラグの値に応じて処理を行っています。

より詳しい説明が必要であれば、ChatGPTなどにこのコードをまるごとコピペして放り込めば、とても分かりやすく解説してくれると思います。
(便利になりました)

リスト1 ストップウォッチのコード

import tkinter as tk
import time

class StopwatchApp:
    def __init__(self, master):
        self.master = master
        self.is_running = False
        self.is_paused = False
        self.is_stopped = True
        self.start_time = None
        self.pause_start_time = None
        self.total_paused_time = 0

        # ウィンドウの設定
        self.master.title("Stopwatch")
        self.master.geometry("200x150")

        # ラベルの作成
        self.label = tk.Label(self.master, text="00:00:00", \
                                        font=("Arial", 24), bg="white")
        self.label.pack(pady=20)

        # スタートボタンの作成
        self.start_button = tk.Button(self.master, text="▶", command=\
                            self.start_stopwatch, font=("Arial", 24), fg="green")
        self.start_button.pack(side=tk.LEFT, padx=10)

        # 一時停止ボタンの作成
        self.pause_button = tk.Button(self.master, text="||", command=\
                            self.pause_stopwatch, font=("Arial", 24), fg="blue")
        self.pause_button.pack(side=tk.LEFT, padx=10)

        # ストップボタンの作成
        self.stop_button = tk.Button(self.master, text="■", command=\
                            self.stop_stopwatch, font=("Arial", 24), fg="red")
        self.stop_button.pack(side=tk.LEFT)

    def start_stopwatch(self):
        if self.is_stopped:
            self.start_time = time.time()
        elif self.is_paused:
            self.pause_button.config(fg="green")
        self.is_running = True
        self.is_paused = False
        self.is_stopped = False
        self.start_button.config(fg="cyan")
        self.update_time()

    def pause_stopwatch(self):
        if self.is_paused:
            self.pause_button.config(fg="green")
            self.is_running = True
            self.is_paused = False
            self.is_stopped = False
            self.update_time()
        elif self.is_running:
            self.pause_start_time = time.time()
            self.pause_button.config(fg="yellowgreen")
            self.is_running = False
            self.is_paused = True
            self.is_stopped = False

    def stop_stopwatch(self):
        if self.is_running:
            self.is_running = False
            self.is_paused = False
            self.is_stopped = True
            self.start_button.config(fg="blue")
        elif self.is_stopped:
            time_string = "00:00:00"
            self.label.config(text=time_string)
        else:   #self.is_paused
            self.is_running = False
            self.is_paused = False
            self.is_stopped = True
            self.pause_button.config(fg="green")
            self.start_button.config(fg="blue")
            time_string = "00:00:00"
            self.label.config(text=time_string)

    def update_time(self):
        if self.is_running:
            current_time = time.time() - self.start_time - self.total_paused_time
            minutes, seconds = divmod(current_time, 60)
            minutes = int(minutes)
            seconds = int(seconds)
            millisecs = int((current_time - minutes * 60 - seconds) * 100.0)
            time_string = "{:02d}:{:02d}:{:02d}".format(minutes, seconds, millisecs)
            self.label.config(text=time_string)
            self.master.after(10, self.update_time)

def main():
    root = tk.Tk()
    app = StopwatchApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

2.2 ビデオプレイヤー

上のストップウォッチを練習台にビデオプレイヤーを作ってみました。(ほとんどChatGPTが出力したまんまですが‥)
時刻を表示しているところに、OpenCVのライブラリも使用してビデオ映像が流れるようにしました。
下には再生、一時停止、停止のボタンを配置しました。

ただしこちらの論理はかなり雑で、一時停止を押すと確かに止まるのですが、再度動画を再生する術がありません。
そして停止を押すと、ウィンドウごと消えてしまいます。

フラグの数を増やしたり、論理を明確にするなどすればちゃんと動くと思うのですが、
ストップウォッチを作るときに、結構大変だったという印象が残っていて、途中であきらめました。
(ChatGPTも途中からちゃんと作るのを嫌がるようになりましたし。。)

ということでビデオプレイヤーのソースコードは未完成のままと言えるかと思います。
悪しからず。
( ゚Д゚)

スト2 ビデオプレイヤー

import cv2
import tkinter as tk
from PIL import Image, ImageTk

class VideoPlayerApp:
    def __init__(self, master, video_path, width, height):
        self.master = master
        self.video_path = video_path
        self.width = width
        self.height = height
        self.cap = cv2.VideoCapture(self.video_path)
        self.is_playing = False

        # ウィンドウの設定
        self.master.title("動画プレーヤー")
        self.master.resizable(True, True)
        self.master.geometry(f"{self.width}x{self.height}")

        # ビデオ表示のキャンバスを作成
        self.canvas = tk.Canvas(self.master, width=\
                    self.width*0.8, height=self.height*0.8)
        self.canvas.pack()

        # 再生ボタンの作成
        self.play_button = tk.Button(self.master, text="再生", \
                                        command=self.play_video)
        self.play_button.pack(side=tk.LEFT, padx=10, pady=10)

        # 一時停止ボタンの作成
        self.pause_button = tk.Button(self.master, text="一時停止", \
                                        command=self.pause_video)
        self.pause_button.pack(side=tk.LEFT, padx=10, pady=10)

        # 停止ボタンの作成
        self.stop_button = tk.Button(self.master, text="停止", \
                                        command=self.stop_video)
        self.stop_button.pack(side=tk.LEFT, padx=10, pady=10)

    def play_video(self):
        self.is_playing = True
        self.show_next_frame()

    def show_next_frame(self):
        if self.is_playing:
            ret, frame = self.cap.read()
            if ret:
                frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                image = Image.fromarray(frame_rgb)
                image_tk = ImageTk.PhotoImage(image=image)
                self.canvas.create_image(0, 0, anchor=tk.NW, image=image_tk)
                self.canvas.image = image_tk
                # 30ミリ秒後に次のフレームを表示
                self.master.after(30, self.show_next_frame)
            else:
                self.stop_video()

    def pause_video(self):
        self.is_playing = False

    def stop_video(self):
        self.is_playing = False
        self.cap.release()
        self.master.destroy()


def main():
    # ビデオファイルのパス
    videoPath = "f:/oke/Python/videos/"

    # ビデオファイルのパス
    video_path = videoPath + "video1.mp4"
    width, height = 800, 600
    root = tk.Tk()
    app = VideoPlayerApp(root, video_path, width, height)
    root.mainloop()

if __name__ == "__main__":
    main()

※ 68,71行目のvideopath、video_path(紛らわしい)は適宜変更してください。

3..exeファイルへの変換

試しにMicrosoftWindows環境で動作する.exe(エグゼ?)ファイルに変換できないかと思い、ChatGPTに聞いてみました。
以下のようにコマンドプロンプトにて入力すると、エグゼファイル(実行可能ファイル)が作れるようです。

pyinstaller --onefile your_script.py

ソースコードがあるディレクトリに移動し、ファイル名は自分のものを入力しEnterを押すと変換が始まります。
終わるとそのディレクトリに”dist”というフォルダーが作られ、その中に実行可能ファイルができるという仕組みです。

じぶんで作ったソフトウェアがアプリのように使え(アプリだけど)、さらにスタートメニューに登録しておくと親しみが深くなるかもしれないです!

4.動作する様子

動画を張り付けておきます。

動画1 ストップウォッチの動く様子

youtu.be

動画2 ビデオプレイヤーの動く様子
昔、筆者が撮影した動画を、動画内にて再生しています。(分かりにくいですね)

youtu.be

以上となります。

お付き合い下さり、ありがとうございました。