質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

[Python初心者] Tkinterを使用したGUI上にTerminalにPrintしたMediaInfoを表示したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,269
退会済みユーザー

退会済みユーザー

Pythonで動画ファイルの情報をpymediaInfoのモジュールを使って取得し、
Terminalで表示される結果をGUI上のMessage Listの部分に表示させたいです。

Terminalに表示するところまではできましたが、それをGUI上に表示することができません。

import tkinter as tk
import tkinter.filedialog as tkfd
from pymediainfo import MediaInfo

# グローバル変数
acv_path = ""
f_path_list = []

### この下に関数を書く ###

def select_file():
    f_conf = [('MOV file (*.mov)', '*mov'), ('AVI file (*.avi)', '*.avi'),('MP4 file (*.mp4)', '*.mp4')]
    paths = tkfd.askopenfiles(filetypes=f_conf)
    for f in paths:
        f_path_list.append(f.name)
    # Insert to Message List
    msgList.insert(tk.END, f_path_list)
    # Insert Input Path TextBox
    inpFld.insert(tk.END, f_path_list)


def get_mediainfo():
    media_info = MediaInfo.parse('/Path')
    for track in media_info.tracks:
    #for k in track.to_data().keys():
    #print("{}.{}={}".format(track.track_type,k,track.to_data()[k]))
        if track.track_type == 'Video':
            print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
            print("{} video_format          {}".format(track.track_type,track.to_data()["format"]))
            print("{} other_format          {}".format(track.track_type,track.to_data()["other_format"][0]))
            print("{} codec_id              {}".format(track.track_type,track.to_data()["codec_id"]))            
            print("{} width                 {}".format(track.track_type,track.to_data()["width"]))
            print("{} height                {}".format(track.track_type,track.to_data()["height"]))
            print("{} framerate             {}".format(track.track_type,track.to_data()["frame_rate"]))
            print("{} scan_type             {}".format(track.track_type,track.to_data()["scan_type"]))
            print("{} duration              {}".format(track.track_type,track.to_data()["other_duration"][3][0:8]))
            print("{} display_aspect_ratio  {}".format(track.track_type,track.to_data()["display_aspect_ratio"]))
            print("{} color_primaries       {}".format(track.track_type,track.to_data()["color_primaries"]))       
            print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
        elif track.track_type == 'Audio':
            print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
            print("{} format                {}".format(track.track_type,track.to_data()["format"]))
            print("{} codec_id              {}".format(track.track_type,track.to_data()["codec_id"]))
            print("{} channel_s             {}".format(track.track_type,track.to_data()["channel_s"]))
            print("{} other_channel_s       {}".format(track.track_type,track.to_data()["other_channel_s"][0]))
            print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
    print("********************************************************************")
    result = ()
    msgList.insert(tk.END,result)




def close_window():
    win.destroy()



if __name__ == "__main__":
    # Main Window
    win = tk.Tk()
    # Window Title
    win.title("MediaInfo App")
    # Window Size
    win.geometry("500x510")
    # Window Resizable
    #win.resizable(0,0)
    # Window Background
    win.configure(bg="#52514F")

### この下に描画内容を書く ###
    #メインフレーム
    mFrm = tk.Frame(win)
    mFrm.configure(bg="#52514F")
    mFrm.pack(padx=3, pady=3, fill="both", expand=1)

    # 通知リスト
    msgList = tk.Listbox(mFrm)
    msgList.configure(height=20, width=50)
    msgList.pack(padx=10, pady=10)

    # 実行ボタン用のフレーム
    ExeFrm = tk.Label(mFrm)
    ExeFrm.configure(fg="white", bg="#52514F", padx="20", pady="10")
    ExeFrm.pack()

    # 実行ボタン
    exeBtn = tk.Button(ExeFrm)
    exeBtn.configure(text="Execute Analysis", command=get_mediainfo)
    exeBtn.pack()

    # Input Path ボタン用のフレーム
    InpFrm = tk.LabelFrame(mFrm)
    InpFrm.configure(text="Input Settings", fg="white", bg="#52514F", padx="20", pady="10")
    InpFrm.pack(pady=5)

    # Input Path ラベル
    inpTxt = tk.Label(InpFrm)
    inpTxt.configure(text="Input Path | 入力", fg="white", bg="#52514F", font=('Helvetica', 10))
    inpTxt.pack(side="left", padx=5) 

    # Input Path 表示
    inpFld = tk.Entry(InpFrm)
    inpFld.configure(fg="black", highlightbackground="#52514F")
    inpFld.pack(side="left", padx=5)

    # ファイル選択ボタン
    inpBtn = tk.Button(InpFrm)
    inpBtn.configure(text="Select File", command=select_file)
    inpBtn.pack(side="right", padx=5)

    # Exitボタン
    extBtn = tk.Button(mFrm)
    extBtn.configure(text="Exit", command=close_window)
    extBtn.pack(padx=5,pady=5)


    # 描画
    win.mainloop()

ソースのパス(/Path)をdef select_file内で選択したファイルパスを使って処理したい。

    media_info = MediaInfo.parse('/Path')

※以前、FFmpegを使って情報の取得をしようとしていましたが、なかなか上手くいかないのでモジュールを使って行うことに挑戦しました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

print は標準出力への出力です(通常は端末に出力)

解決策: msgList.insert(tk.END, ...) に出力します

標準出力の出力先自体を変更(リダイレクト)する方法もありますが、
この場合の簡単な方法は print の置き換え

# get_mediainfo関数内の先頭で
from functools import partial
print = partial(msgList.insert, tk.END)
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

もしくは、各行のprint 自体を書き換えた方が良いです。
コードを読む時printは通常、端末への出力と思ってしまうので、

from functools import partial
listAppend = partial(msgList.insert, tk.END)
listAppend("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/27 20:17

    ありがとうございます。教えていただいた方法で表示することができました。
    表示する際にリスト化されていないので、ガタガタしていることが気になりますが、gridやリストにしてカラムを設定することは可能なのでしょうか?

    キャンセル

  • 2020/09/27 21:25 編集

    簡単な対応は、等幅フォントを利用するですが、
    > msgList = tk.Listbox(mFrm, font=("Monaco", 10)) #フォント名は調べて下さい

    カラム設定は、Listbox の代わりに ttk.Treeview を使い
    columns や show="headings" のオプションを設定する事で対応できます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る