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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Q&A

1回答

799閲覧

Python3でGUIをtkinterで後付したい。

pyt

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

0グッド

0クリップ

投稿2019/02/11 21:11

Python3でGUIをtkinterで後付したい。

python3で画像のヒストグラム調整をしたりするプログラムを書きました。
CUIでファイルの場所を入力すると自動で調整された画像が出力されるように作成しました。
このプログラムにGUIを足したいと思いTkinterを用いたのですが、うまくいきません。

TkinterでGUIを作成して、ファイルの場所を入力する場所を作り、ボタンを押すとファイルの場所を取得するところまではうまくいったのですが、ウィンドウを閉じないと得られたファイルの値を調整プログラムに渡せません。

このように、すでにCUIで処理を作成して、ここに必要な引数を入力するために後付で入力用のインターフェイスとしてGUIを作成する際に最も良い方法をご存知でしたら教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ヒストグラム調整プログラムというのはこんな雰囲気に作成されたのだと思います。

・(A)初期化など
・(B)filename = input('enter filename: ') <==入力
・(C)画像読み込み/ヒストグラム調整等の計算
・(D)画像を表示 ==> 出力

上記のようにCUIアプリは「メインプログラムが実行する順序を自ら制御して順に必要な処理を行う」ように作りますが、GUIプログラムの場合、プログラムの制御は「画面を操作する利用者が握る」構造になっています。例えばTkinterを使うと

python

1... 2 3root = tk.Tk() 4画面の初期化 5root.mainloop() # この関数がGUIを表示している間全ての制御を司る 6 # (プログラマーが自由に処理順を決められない。全てmainloop()が支配する) 7 <-- ユーザーがボタンをクリック 8 --> ボタン操作に対するハンドラー関数が呼び出される 9 <-- ユーザーがキー入力 10 --> キー操作に対するハンドラー関数が呼び出される 11 ... 12 <-- ウィンドウを閉じる(通常はGUIアプリの終了操作) 13このタイミングでようやくmainloopが終了 14GUIプログラムではmainloop()が終わったらアプリケーションの終了になる

こんなふうに制御の流れがCUI/GUIでは大きく異なります。この「利用者がGUIを操作する度に必要な処理を行う」という制御方式をイベント駆動方式なんて言い方をします。

元々CUIで作成していたプログラムをCUIにする(多分)最も素朴な方法は

  • プログラムの各段階を「関数分割する」

例えば最初に述べたCUIの各段階((A)~(D))をそれぞれ関数に分割します。

  • それぞれの関数をイベント駆動方式の中の各ハンドラーの中から呼び出すようにする

もし最初に書いたような内容ですと(A)をmainloopの前に実行し、ファイル名をGUIで入力させて計算開始を指示するボタンなどを押したときのハンドラーから(B)~(D)を呼び出すようにします。

といった感じだと思います。要するに今まで主たる制御を行っていたCUIのコードでプログラムの制御を支配するのではなく、あくまでGUIを司るmainloop()関数に制御を支配させ、従来のCUIコードは「mainloop()の中から自動的に呼び出されるハンドラーからさらに呼び出されるサブルーチン」にするのです。

本来なら画像処理など時間がかかる処理をハンドラーの中から直接呼び出すのはGUIアプリケーションとしてあまりよくないのですが(なぜなら時間がかかる処理をやっている間、画面がフリーズしたような状態になるから)、とりあえず動かすためにはまずこのあたりを目指して作ってみるとよいのではないでしょうか?

長時間の計算中でも画面がフリーズするようなことなく「いつでもキャンセルボタンを押せる」ような作りにするには長時間かかる処理を別のスレッドにすればよいのですが、それはまた別の課題として考えるのがよいのではないかと思います。

投稿2019/02/12 02:18

KSwordOfHaste

総合スコア18394

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

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

pyt

2019/02/13 03:38

ありがとうございます。GUIを用いるのは初めてだったため非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問