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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6300閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/24 10:53

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

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

Python

1import tkinter as tk 2import tkinter.filedialog as tkfd 3from pymediainfo import MediaInfo 4 5# グローバル変数 6acv_path = "" 7f_path_list = [] 8 9### この下に関数を書く ### 10 11def select_file(): 12 f_conf = [('MOV file (*.mov)', '*mov'), ('AVI file (*.avi)', '*.avi'),('MP4 file (*.mp4)', '*.mp4')] 13 paths = tkfd.askopenfiles(filetypes=f_conf) 14 for f in paths: 15 f_path_list.append(f.name) 16 # Insert to Message List 17 msgList.insert(tk.END, f_path_list) 18 # Insert Input Path TextBox 19 inpFld.insert(tk.END, f_path_list) 20 21 22def get_mediainfo(): 23 media_info = MediaInfo.parse('/Path') 24 for track in media_info.tracks: 25 #for k in track.to_data().keys(): 26 #print("{}.{}={}".format(track.track_type,k,track.to_data()[k])) 27 if track.track_type == 'Video': 28 print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") 29 print("{} video_format {}".format(track.track_type,track.to_data()["format"])) 30 print("{} other_format {}".format(track.track_type,track.to_data()["other_format"][0])) 31 print("{} codec_id {}".format(track.track_type,track.to_data()["codec_id"])) 32 print("{} width {}".format(track.track_type,track.to_data()["width"])) 33 print("{} height {}".format(track.track_type,track.to_data()["height"])) 34 print("{} framerate {}".format(track.track_type,track.to_data()["frame_rate"])) 35 print("{} scan_type {}".format(track.track_type,track.to_data()["scan_type"])) 36 print("{} duration {}".format(track.track_type,track.to_data()["other_duration"][3][0:8])) 37 print("{} display_aspect_ratio {}".format(track.track_type,track.to_data()["display_aspect_ratio"])) 38 print("{} color_primaries {}".format(track.track_type,track.to_data()["color_primaries"])) 39 print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") 40 elif track.track_type == 'Audio': 41 print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") 42 print("{} format {}".format(track.track_type,track.to_data()["format"])) 43 print("{} codec_id {}".format(track.track_type,track.to_data()["codec_id"])) 44 print("{} channel_s {}".format(track.track_type,track.to_data()["channel_s"])) 45 print("{} other_channel_s {}".format(track.track_type,track.to_data()["other_channel_s"][0])) 46 print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") 47 print("********************************************************************") 48 result = () 49 msgList.insert(tk.END,result) 50 51 52 53 54def close_window(): 55 win.destroy() 56 57 58 59if __name__ == "__main__": 60 # Main Window 61 win = tk.Tk() 62 # Window Title 63 win.title("MediaInfo App") 64 # Window Size 65 win.geometry("500x510") 66 # Window Resizable 67 #win.resizable(0,0) 68 # Window Background 69 win.configure(bg="#52514F") 70 71### この下に描画内容を書く ### 72 #メインフレーム 73 mFrm = tk.Frame(win) 74 mFrm.configure(bg="#52514F") 75 mFrm.pack(padx=3, pady=3, fill="both", expand=1) 76 77 # 通知リスト 78 msgList = tk.Listbox(mFrm) 79 msgList.configure(height=20, width=50) 80 msgList.pack(padx=10, pady=10) 81 82 # 実行ボタン用のフレーム 83 ExeFrm = tk.Label(mFrm) 84 ExeFrm.configure(fg="white", bg="#52514F", padx="20", pady="10") 85 ExeFrm.pack() 86 87 # 実行ボタン 88 exeBtn = tk.Button(ExeFrm) 89 exeBtn.configure(text="Execute Analysis", command=get_mediainfo) 90 exeBtn.pack() 91 92 # Input Path ボタン用のフレーム 93 InpFrm = tk.LabelFrame(mFrm) 94 InpFrm.configure(text="Input Settings", fg="white", bg="#52514F", padx="20", pady="10") 95 InpFrm.pack(pady=5) 96 97 # Input Path ラベル 98 inpTxt = tk.Label(InpFrm) 99 inpTxt.configure(text="Input Path | 入力", fg="white", bg="#52514F", font=('Helvetica', 10)) 100 inpTxt.pack(side="left", padx=5) 101 102 # Input Path 表示 103 inpFld = tk.Entry(InpFrm) 104 inpFld.configure(fg="black", highlightbackground="#52514F") 105 inpFld.pack(side="left", padx=5) 106 107 # ファイル選択ボタン 108 inpBtn = tk.Button(InpFrm) 109 inpBtn.configure(text="Select File", command=select_file) 110 inpBtn.pack(side="right", padx=5) 111 112 # Exitボタン 113 extBtn = tk.Button(mFrm) 114 extBtn.configure(text="Exit", command=close_window) 115 extBtn.pack(padx=5,pady=5) 116 117 118 # 描画 119 win.mainloop()

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

media_info = MediaInfo.parse('/Path')

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

python

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

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

python

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

投稿2020/09/26 08:54

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/27 11:17

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

2020/09/28 00:49 編集

簡単な対応は、等幅フォントを利用するですが、 > msgList = tk.Listbox(mFrm, font=("Monaco", 10)) #フォント名は調べて下さい カラム設定は、Listbox の代わりに ttk.Treeview を使い columns や show="headings" のオプションを設定する事で対応できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問