video_converter.gui module

Tkinter による GUI インターフェース。

ウィンドウの構築は Builder パターン (WindowBuilder) で行い、 ウィジェットへの参照は MyWindow が保持する。変換の進捗は video_converter.progress.FFmpegTCPSender から TkPBarWriter のコールバックへ通知される (Observer パターン)。

video_converter.gui.METHODS = {'audio_eliminate': <function audio_eliminate>, 'audio_extract': <function audio_extract>, 'compress': <function compress>, 'to_mp4': <function to_mp4>}

ラジオボタンの選択値と変換関数の対応表

class video_converter.gui.MyWindow[ソース]

ベースクラス: object

GUI のウィジェットおよび状態変数への参照を保持するコンテナ。

各属性は WindowBuildercreate_* メソッドによって設定され、 生成前は None である。

class video_converter.gui.StdoutRedirector(text_widget)[ソース]

ベースクラス: object

標準出力を Tkinter のテキストウィジェットへ転送するクラス。

パラメータ:

text_widget (Text) -- 出力先のテキストウィジェット。

fileno()[ソース]

ファイルディスクリプタを持たないことを示す。

例外:

OSError -- 常に送出する。sys.stdout を期待する側が ディスクリプタを要求した場合に、誤った値を返さないため。

戻り値の型:

int

flush()[ソース]

sys.stdout との互換性のために用意した何もしないメソッド。

戻り値の型:

None

isatty()[ソース]

端末ではないことを示す。

戻り値:

常に False

戻り値の型:

bool

write(message)[ソース]

メッセージをテキストウィジェットへ書き込む。

ウィジェットが既に破棄されている場合は何もしない。

パラメータ:

message (str) -- 書き込む文字列。

戻り値:

書き込んだ文字数。

戻り値の型:

int

class video_converter.gui.TkPBarWriter(total=None)[ソース]

ベースクラス: object

進捗の通知を受けて GUI のプログレスバーを更新するクラス (Observer)。

パラメータ:

total (float | None) -- 動画の合計時間 (秒)。生成時点では不明なため既定は None で、変換開始時に convert_and_send()reset() を通じて 設定する。

callback(step, window)[ソース]

進捗をウィジェットへ反映する。

パラメータ:
  • step (float) -- 変換済みの再生時間 (秒)。

  • window (MyWindow) -- 更新対象のウィジェットを保持するウィンドウ。

戻り値の型:

None

reset(total)[ソース]

変換の開始に合わせて合計時間と計測開始時刻を初期化する。

パラメータ:

total (float) -- 動画の合計時間 (秒)。

戻り値の型:

None

class video_converter.gui.WindowBuilder[ソース]

ベースクラス: object

MyWindow を組み立てる Builder。

create_* メソッドはウィジェットを生成して返すと同時に、状態変数を window へ登録する。配置 (grid) は呼び出し側の責務とする。

create_browse_button()[ソース]

ファイル選択ダイアログを開くボタンを生成する。

戻り値:

「ファイルを選択」ボタン。

戻り値の型:

Button

create_console(height, width)[ソース]

標準出力を表示するコンソールを生成する。

副作用として sys.stdoutStdoutRedirector へ差し替え、 ルートウィンドウが破棄された時点で元の sys.stdout へ戻す ハンドラを登録する。

パラメータ:
  • height (int) -- コンソールの高さ (行数)。

  • width (int) -- コンソールの幅 (文字数)。

戻り値:

コンソールとして使うテキストウィジェット。

戻り値の型:

Text

create_convert_button(writer)[ソース]

変換を開始するボタンを生成する。

パラメータ:

writer (TkPBarWriter) -- 進捗をウィジェットへ反映するライター。

戻り値:

「変換」ボタン。

戻り値の型:

Button

create_method_options()[ソース]

変換方式を選択するラジオボタン群を生成する。

選択値は METHODS のキー (to_mp4audio_extractaudio_eliminatecompress) に対応する。

戻り値:

ラジオボタンのリスト。

戻り値の型:

list[Radiobutton]

create_path_entry(width)[ソース]

ファイルパス入力欄を生成する。

入力欄自体をドロップ対象として登録する。

パラメータ:

width (int) -- 入力欄の幅 (文字数)。

戻り値:

ファイルパス入力欄。

戻り値の型:

Entry

create_pbar_items(pbar_length)[ソース]

進捗率ラベル・プログレスバー・残り時間ラベルを生成する。

プログレスバーは進捗を 0.0〜1.0 の割合で受け取る。

パラメータ:

pbar_length (int) -- プログレスバーの長さ (ピクセル)。

戻り値:

(進捗率ラベル, プログレスバー, 残り時間ラベル) のタプル。

戻り値の型:

tuple[Label, Progressbar, Label]

create_window(geometry)[ソース]

ルートウィンドウを生成する。

ドラッグ&ドロップを利用するため、tk.Tk ではなく TkinterDnD.Tk を使用する。

パラメータ:

geometry (str) -- "510x420" 形式のウィンドウサイズ。

戻り値の型:

None

video_converter.gui._browse_file(string_var)[ソース]

ファイル選択ダイアログを開き、選択されたパスを変数へ設定する。

パラメータ:

string_var (StringVar) -- 選択されたファイルパスの格納先。

戻り値の型:

None

video_converter.gui._convert(window, pbar_writer)[ソース]

GUI の入力内容にもとづき変換を実行する (例外はそのまま送出する)。

パラメータ:
  • window (MyWindow) -- 入力値と進捗ウィジェットを保持するウィンドウ。

  • pbar_writer (TkPBarWriter) -- 進捗をウィジェットへ反映するライター。

戻り値の型:

None

video_converter.gui._drop_file(event, string_var)[ソース]

ドラッグ&ドロップされたファイルパスを変数へ設定する。

tkinterdnd2 は Windows 形式のパスを {C:/path/to/file.mp4} のように 波括弧で囲んで渡すため、それを取り除いてから格納する。

パラメータ:
  • event (Event) -- <<Drop>> イベント。data にファイルパスを含む。

  • string_var (StringVar) -- ドロップされたファイルパスの格納先。

戻り値の型:

None

video_converter.gui.convert_and_send(window, pbar_writer)[ソース]

GUI の入力内容にもとづき変換を実行する。

FFmpeg の実行と進捗受信を gevent の greenlet で並行に動かし、 両者の完了を待ち合わせる。

変換に失敗した場合、例外はそのままでは Tk が sys.stderr へ出力して しまい、コンソール領域 (sys.stdout を転送) にも表示されない。 --noconsole でビルドした実行ファイルでは何も見えなくなるため、 ここで捕捉してダイアログとコンソールの両方へ表示する。

パラメータ:
  • window (MyWindow) -- 入力値と進捗ウィジェットを保持するウィンドウ。

  • pbar_writer (TkPBarWriter) -- 進捗をウィジェットへ反映するライター。

戻り値の型:

None

video_converter.gui.create_window()[ソース]

全ウィジェットを生成・配置したウィンドウを構築する。

mainloop() は呼び出さないため、テストから利用できる。

戻り値:

構築済みのウィンドウ。

戻り値の型:

MyWindow

video_converter.gui.open_window()[ソース]

ウィンドウを構築し、イベントループを開始する。

戻り値の型:

None