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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Tkinter

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

Python

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

Q&A

解決済

1回答

620閲覧

tkinterで作ったプログラムが実行後ウィジェットなどが出力されない

sdnfaosdbo

総合スコア6

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Tkinter

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

Python

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

0グッド

1クリップ

投稿2022/04/12 07:15

質問

tkinterを用いて画像をリサイズするプログラムを作ったのですが、実行するとウィジェットも何も表示されない状態です。
busy状態でエラーも何も表示されないので困っています。
何が間違っているのかご教示いただけると幸いです。
よろしくお願いいたします。

コード

python

1import os 2from tkinter import ttk 3#from tkinter import * 4#from tkinter.ttk import * 5from tkinter import filedialog 6from tkinter import messagebox 7from PIL import Image 8 9def indialog_clicked(): 10 iDir = os.path.abspath(os.path.dirname('__file__')) 11 in_dir = tkinter.filedialog.askdirectory(initialdir=iDir) 12 entry1.set(in_dir) 13 14def outdialog_clicked(): 15 iDir = os.path.abspath(os.path.dirname('__file__')) 16 out_dir = tkinter.filedialog.askdirectory(initialdir=iDir) 17 entry2.set(out_dir) 18 19def conductMain(): 20 inpath = entry1.get() 21 outpath = entry2.get() 22 23 files = os.listdir(inpath) 24 25 for file in files: 26 img = Image.open(os.path.join(inpath, file)) 27 #画像のパスを生成し、imgへ画像を格納 28 img_resize = img.resize((1080, 720)) 29 #imgへ格納した画像を720×1080サイズ変更 30 img_resize.save(os.path.join(outpath, file)) 31 32if __name__ == "__main__": 33 root = Tk() 34 root.withdraw() 35 root.title("image Resize") 36 root.geometry("400x300") 37 38 frame1 = ttk.Frame(root, padding=10) 39 frame1.grid(row=0,column=1,sticky=E) 40 41 inLabel = ttk.Label(frame1,text="読込フォルダ指定", padding=(5,2)) 42 inLabel.pack(side=LEFT) 43 44 # 「フォルダ参照」エントリーの作成 45 entry1 = StringVar() 46 IDirEntry = ttk.Entry(frame1, textvariable=entry1, width=30) 47 IDirEntry.pack(side=LEFT) 48 49 # 「フォルダ参照」ボタンの作成 50 IDirButton = ttk.Button(frame1, text="参照", command=indialog_clicked) 51 IDirButton.pack(side=LEFT) 52 53 # Frame2の作成 54 frame2 = ttk.Frame(root, padding=10) 55 frame2.grid(row=2, column=1, sticky=E) 56 57 # 「ファイル参照」ラベルの作成 58 outLabel = ttk.Label(frame2, text="書出フォルダ指定", padding=(5, 2)) 59 outLabel.pack(side=LEFT) 60 61 # 「ファイル参照」エントリーの作成 62 entry2 = StringVar() 63 IFileEntry = ttk.Entry(frame2, textvariable=entry2, width=30) 64 IFileEntry.pack(side=LEFT) 65 66 # 「ファイル参照」ボタンの作成 67 IFileButton = ttk.Button(frame2, text="参照", command=outdialog_clicked) 68 IFileButton.pack(side=LEFT) 69 70 # Frame3の作成 71 frame3 = ttk.Frame(root, padding=10) 72 frame3.grid(row=5,column=1,sticky=W) 73 74 # 実行ボタンの設置 75 button1 = ttk.Button(frame3, text="実行", command=conductMain) 76 button1.pack(fill = "x", padx=30, side = "left") 77 78 # キャンセルボタンの設置 79 button2 = ttk.Button(frame3, text=("閉じる"), command=quit) 80 button2.pack(fill = "x", padx=30, side = "left") 81 82 83 root.mainloop()

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

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

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

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

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

xail2222

2022/04/13 00:35

root.withdraw() は何の為にあるのですか?
teamikl

2022/04/13 04:58

withdraw はウィンドウを非表示にするメソッドですね。 withdrawが原因で busy 状態にはなりませんが、 (非表示なので操作ができませんが、処理に時間がかかっているわけではないので busy ではありません) ウィンドウが表示されないのはそちらが回答としては適切だったかな。 私の回答は、「実行」ボタンを押した時に、ファイルが大量にあった場合 画像処理をしている間、応答なし(busy状態)になるみたいなケースを想定してます。
guest

回答1

0

ベストアンサー

GUI等のイベント駆動プログラミングでは、
イベントループ内で呼び出される関数は、
即座に処理を終了しなければ、応答なしとなってしまいます。

時間の掛かるタスクがある場合は、
別スレッドや別プロセスを用いて実行するようにしてください。

具体的には、
conductMain 関数内の for ループ以降を別スレッドで実行することで解消します。
但し、別スレッドから GUI に直接アクセスしないように注意。(入力値の参照はメイン側で行う)

投稿2022/04/12 23:44

teamikl

総合スコア8664

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

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

sdnfaosdbo

2022/04/18 02:31

ご回答いただきありがとうございました。 マルチスレッドなど初めてなので挑戦してみます。 ありがとうございます。
sdnfaosdbo

2022/04/18 02:44

質問なのですが、別スレッドからGUIにアクセスしないというのは、今回のプログラムですと、image.openをメインで行なって、その後別スレッドに回すという形でしょうか?
teamikl

2022/04/18 03:11

いいえ、tkinter の entry1.get() 迄がメインスレッドで、 Image.open は別スレッド側で行います。 メイン側で開いて別スレッドで処理という スレッドを跨ぐリソースの利用は、同期処理をきちんとしないと タイミング次第で誤作動の原因になる為、 基本は一つのスレッド内で完結するようにします。 例外として、logging モジュールや 同期queue 等の マルチスレッドでも安全に使えるように配慮されたものは、 メインスレッドと別スレッド側で同時に使っても安全です。 例えば、マルチスレッドでは print 関数も保証されていないので、 print デバッグ等の用途であれば、代替として logging モジュールを使います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問