diff --git a/README.md b/README.md index 2406dff..ae2f864 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ - [ ] ウインドウサイズ変更時の再描画 - [x] ステータスバー -- [ ] GUI 改善 -- [ ] メッセージ表示 +- [x] GUI 改善 +- [x] メッセージ表示 - [x] アイコン設定 +- [ ] フレーム情報,分析結果をステータスバーに表示 + . diff --git a/gui_app.py b/gui_app.py index 294174b..1519478 100644 --- a/gui_app.py +++ b/gui_app.py @@ -17,6 +17,8 @@ self.lp = lumen_profiler.LumenProfiler() self.is_open = False self.is_analyzed = False + self.uifont_l = ("MS UI Gothic", 14) + self.uifont_s = ("MS UI Gothic", 11) def make_window(self): self.tkroot.title("Lumen Profiler") @@ -26,36 +28,59 @@ self.top_frame = tk.Frame(self.tkroot) self.top_frame.pack(fill=tk.X, pady=5) self.file_button = tk.Button( - self.top_frame, text="映像ファイルを開く", command=self.open_movie + self.top_frame, + text="映像ファイルを開く", + command=self.open_movie, + font=self.uifont_l, ) self.file_button.pack(side=tk.LEFT, padx=(10, 0)) - self.file_text = tk.Label(self.top_frame, text="no movie") + self.file_text = tk.Label(self.top_frame, text="no movie", font=self.uifont_s) self.file_text.pack(side=tk.LEFT, fill=tk.X, padx=(20, 0)) # 分析フレーム self.analize_frame = tk.Frame(self.tkroot) # self.analize_frame.pack(fill=tk.X, pady=5) self.analyze_button = tk.Button( - self.analize_frame, text="分析を実行", command=self.analyze + self.analize_frame, + text="分析実行", + command=self.analyze, + font=self.uifont_l, ) self.analyze_button.pack(side=tk.LEFT, padx=(10, 0)) - self.interval_label = tk.Label(self.analize_frame, text="分析フレーム間隔") + self.interval_label = tk.Label( + self.analize_frame, + text="分析フレーム間隔", + font=self.uifont_s, + ) self.interval_label.pack(side=tk.LEFT, padx=(20, 0)) - self.interval_text = tk.Entry(self.analize_frame, width=5, justify=tk.RIGHT) + self.interval_text = tk.Entry( + self.analize_frame, width=5, justify=tk.RIGHT, font=self.uifont_s + ) self.interval_text.insert(tk.END, "2") self.interval_text.pack(side=tk.LEFT) - self.area_ratio_label = tk.Label(self.analize_frame, text="暗部の面積比率(%)") + self.area_ratio_label = tk.Label( + self.analize_frame, text="暗部の面積比率(%)", font=self.uifont_s + ) self.area_ratio_label.pack(side=tk.LEFT, padx=(20, 0)) - self.area_ratio_text = tk.Entry(self.analize_frame, width=5, justify=tk.RIGHT) + self.area_ratio_text = tk.Entry( + self.analize_frame, width=5, justify=tk.RIGHT, font=self.uifont_s + ) self.area_ratio_text.insert(tk.END, "8.0") self.area_ratio_text.pack(side=tk.LEFT) - self.sigma_label = tk.Label(self.analize_frame, text="シグマ(輪郭の円滑性)") + self.sigma_label = tk.Label( + self.analize_frame, text="輪郭の円滑性", font=self.uifont_s + ) self.sigma_label.pack(side=tk.LEFT, padx=(20, 0)) - self.sigma_text = tk.Entry(self.analize_frame, width=5, justify=tk.RIGHT) + self.sigma_text = tk.Entry( + self.analize_frame, width=5, justify=tk.RIGHT, font=self.uifont_s + ) self.sigma_text.insert(tk.END, "5.0") self.sigma_text.pack(side=tk.LEFT) self.save_button = tk.Button( - self.analize_frame, text="分析結果を保存", command=self.on_save + self.analize_frame, + text="結果保存", + command=self.on_save, + font=self.uifont_l, ) self.save_button.pack(side=tk.LEFT, padx=(20, 0)) @@ -68,14 +93,22 @@ to=0, orient=tk.HORIZONTAL, command=self.on_time_slider_change, + font=self.uifont_s, ) self.time_slider.pack(fill=tk.X, padx=(10, 10)) # ステータスバー表示 self.status_frame = tk.Frame(self.tkroot) self.status_frame.pack(fill=tk.X) - self.status_text = tk.Text(self.status_frame, state="disable", height=1) - self.status_text.pack(side=tk.LEFT, expand=True, padx=(10, 0)) + self.status_text = tk.Text( + self.status_frame, + state="disabled", + height=1, + width=50, + bg="lightgray", + font=self.uifont_l, + ) + self.status_text.pack(side=tk.LEFT, padx=(10, 0)) self.progressbar = ttk.Progressbar( self.status_frame, orient="horizontal", @@ -83,7 +116,8 @@ mode="determinate", maximum=99, ) - self.progressbar.pack(side=tk.LEFT, padx=(20, 10)) + self.progressbar.pack(side=tk.RIGHT, padx=(20, 10)) + self.update_status("映像ファイルを開いてください") self.tkroot.iconphoto(False, tk.PhotoImage(data=icon.icongif)) self.tkroot.mainloop() @@ -95,22 +129,24 @@ sigma = float(self.sigma_text.get()) # 分析(ワーカースレッド) - thread = threading.Thread( - target=self.lp.profiling, args=(ratio, sigma, interval) - ) - thread.start() - while thread.is_alive(): - self.progressbar.configure(value=self.lp.progress_count % 100) - self.progressbar.update() - time.sleep(0.01) - thread.join() - self.progressbar.configure(value=0) + self.threaded_task(self.lp.profiling, (ratio, sigma, interval)) + # thread = threading.Thread( + # target=self.lp.profiling, args=(ratio, sigma, interval) + # ) + # thread.start() + # while thread.is_alive(): + # self.progressbar.configure(value=self.lp.progress_count % 100) + # self.progressbar.update() + # time.sleep(0.01) + # thread.join() + # self.progressbar.configure(value=0) # self.lp.profiling(ratio, sigma, interval) self.time_slider.config(to=len(self.lp.results) - 1) self.time_slider.set(0) self.is_analyzed = True self.show_image() + self.update_status("分析完了") # 映像ファイルを開く def open_movie(self): @@ -119,15 +155,7 @@ return # 映像読み込み(ワーカースレッド) - thread = threading.Thread(target=self.lp.load_movie, args=(self.moviefilename,)) - thread.start() - while thread.is_alive(): - self.progressbar.configure(value=self.lp.progress_count % 100) - self.progressbar.update() - time.sleep(0.01) - thread.join() - self.progressbar.configure(value=0) - # self.lp.load_movie(filename) + self.threaded_task(self.lp.load_movie, (self.moviefilename,)) # 読み込み後の処理 self.file_text.config(text=self.moviefilename) @@ -135,10 +163,31 @@ self.time_slider.config(to=self.lp.frame_count - 1) self.is_analyzed = False self.show_image() + self.update_status("条件を設定して分析を実行してください") if not self.is_open: self.analize_frame.pack(fill=tk.X, pady=5, after=self.top_frame) self.is_open = True + # スレッド処理 + def threaded_task(self, task_func, task_args): + thread = threading.Thread(target=task_func, args=task_args) + thread.start() + self.update_status("処理中") + while thread.is_alive(): + self.progressbar.configure(value=self.lp.progress_count % 100) + self.tkroot.update_idletasks() + time.sleep(0.01) + thread.join() + self.progressbar.configure(value=0) + # self.status_text.delete(1.0, tk.END) + + def update_status(self, text): + self.status_text.config(state="normal") + self.status_text.delete("1.0", tk.END) + self.status_text.insert(tk.END, text) + self.status_text.config(state="disabled") + self.status_text.update() + # 分析結果を保存 def on_save(self): fn = os.path.splitext(os.path.basename(self.moviefilename))[0]