※なにか気になる点がありましたらコメント欄にご記入ください。
【目次】
1.はじめに
ちょっと思い付きで「作ってみたいなー」というノリでコードを書いてみました。
最近は特にコーディングに関しては、ChatGPT3.5の力を借りることが多いです。
覚え書として残しておこうと思います。
※Pythonはver.3.12を使用しましたが、以前のバージョンでも動くと思います。
PC環境はWindows11 64bitです。
2.ソースコード
作ったものは2つです。
2.1 ストップウォッチ
画面上側に時間を表示し、下側に操作用のボタンを配置しています。(PythonのTkinterというライブラリではウィジェットと呼ぶらしいです)
それぞれのボタンを押すごとにそれに対応した関数が呼び出され、フラグ(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ファイルへの変換
試しにMicrosoftのWindows環境で動作する.exe(エグゼ?)ファイルに変換できないかと思い、ChatGPTに聞いてみました。
以下のようにコマンドプロンプトにて入力すると、エグゼファイル(実行可能ファイル)が作れるようです。
pyinstaller --onefile your_script.py
ソースコードがあるディレクトリに移動し、ファイル名は自分のものを入力しEnterを押すと変換が始まります。
終わるとそのディレクトリに”dist”というフォルダーが作られ、その中に実行可能ファイルができるという仕組みです。
じぶんで作ったソフトウェアがアプリのように使え(アプリだけど)、さらにスタートメニューに登録しておくと親しみが深くなるかもしれないです!