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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Tkinter

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

Python

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

Q&A

解決済

1回答

13213閲覧

Python GUI Tkinterでの戻り値

AbcdefgFirst

総合スコア33

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/03/01 01:07

お世話になっております。
PythonのTkinterのGUIから読込みたいファイルのパスを取得したいのですが戻り値がNoneとなり、パスが取得できません。

### ディレクトリ
main.py
read_file.py
sample.xlsx
templates
|-index.html

main.py

python

1# -*- coding: utf-8 -*- 2from flask import Flask, render_template 3import os 4import read_file as rf 5import tkinter 6from tkinter import ttk, filedialog, messagebox 7 8app = Flask(__name__) 9 10@app.route('/', methods=['GET', 'POST']) 11def index(): 12 f = rf.draw_GUI() 13 print(f) #Noneになる 14 return render_template('index.html') 15 16if __name__ == '__main__': 17 port = int(os.getenv('PORT', 5000)) 18 app.run(host='0.0.0.0', port=port, threaded=True, debug=True)

read_file.py

python

1import tkinter 2from tkinter import ttk, filedialog, messagebox 3 4def draw_GUI(): 5 tk = tkinter.Tk() 6 tk.geometry('500x500') 7 tk.title('Select input File') 8 9 def ask_file(): 10 path = filedialog.askopenfilename() 11 file_path.set(path) 12 13 def submit(): 14 input_dir = file_path.get() 15 return input_dir 16 17 file_path = tkinter.StringVar() 18 19 frm = ttk.Frame(tk) 20 frm.grid(column=0, row=0, sticky=tkinter.NSEW, padx=5, pady=10) 21 22 filepath_label = ttk.Label(frm, text='ファイル指定') 23 filepath_box = ttk.Entry(frm, textvariable=file_path) 24 filepath_btn = ttk.Button(frm, text='参照', command=ask_file) 25 submit_btn = ttk.Button(frm, text='実行', command=submit) 26 27 filepath_label.grid(column=0, row=0, pady=10) 28 filepath_box.grid(column=1, row=0, sticky=tkinter.EW, padx=5) 29 filepath_btn.grid(column=2, row=0) 30 submit_btn.grid(column=1, row=1) 31 32 tk.columnconfigure(0, weight=1) 33 tk.rowconfigure(0, weight=1) 34 frm.columnconfigure(1, weight=1) 35 36 tk.mainloop()

http://localhost:5000/にアクセスすると添付のような画面になり参照ボタンを押すと選択したファイルのパスがテキストボックスに入力されるのですが、実行ボタンを押した時に変数に入れる事が出来ない状態です。
実行ボタンを押した時に変数にファイルのパスを取得して、tkinterを終了したいのですがどこを修正したら良いか教えて頂けませんでしょうか。

宜しくお願い致します。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードの問題点は、return が無い為です。

mainloop 後に tkinter の情報にアクセスするのは少し工夫が必要で、
一旦別の変数にいれてから quit で mainloop を終了します

python

1 input_dir = "" 2 def submit(): 3 nonlocal input_dir 4 input_dir = file_path.get() 5 6 tk.quit() # mainloop を終了する 7 8 # XXX: ここでのreturn は mainloop() 内で処理される 9 10 # draw_GUI 関数内 mainloop 後に 11 12 return input_dir

但し、他に問題があって、こちらの方が重要
Web でのリクエスト処理内で GUI (tkinter等) を使うべきではありません。

設計上の重大な問題があります。

  • このスクリプトのGUIは「サーバー側」で実行されます。

 ローカル環境でサーバーを動かす場合は、
実質クライアントとサーバーが同じ環境ですが、
他人がアクセスする場合や、外部でサーバーを動かす場合を想定できてません。

 このサーバーを外部公開した場合、
リクエストの度にサーバー側でダイアログが開く事になります。
サーバー利用するような環境では、デスクトップ環境は構築されてない事の方が多いはず。

  • Web のリクエスト処理内での GUI は、

 GUI のイベントループがリクエスト処理を一時的にブロックするので、
サーバーのパフォーマンス低下につながります。

許容できるとすれば、外部公開をせず自分しか使わないような状況ですが、
その場合でも設計の見直しをお勧めします。

解決策:
ブラウザ(クライアント)側で処理できるように HTML でファイル入力欄を作ってください。

ローカル環境で動く GUI (tkinter) 内で処理したい場合でも、
サーバーとは必要なデータのみを通信をするような構成にした方が良いです。

投稿2021/03/01 02:34

teamikl

総合スコア8664

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

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

AbcdefgFirst

2021/03/03 00:03

teamikl様 ご回答ありがとうございます。 頂いたコードを試したところ戻り値を取得できました。 設計については少し考えなおしてみます。 ご指摘頂きありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問