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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

1454閲覧

lambaで実行した関数の中の内部関数の戻り値を取り出したい。関数の戻り値が正しく代入出来ない。

Aki1000

総合スコア78

Python 3.x

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2018/11/16 04:56

編集2018/11/16 07:21

a=QuestionBox("質問箱","temp.txt")
とすると、質問用のメッセージボックスが出て、ボタンが押されたら書かれたテキストを、ファイルに書き込んだ後、そのテキストを戻り値とするコードを作っています。

しかしながら、下記のコードのFlagWright():の処理では、ファイルには正しく書き込まれるのですが、戻り値がnoneとなってしまいます。
どうしたら、正しく戻り値がaに入力されるのでしょうか?

追記
root.mainloop()の後にreturn numと書くと、その値は戻り値としてaに代入される。
def QuestionBoxの中の内部関数としてdef FlagWrightを書いたが、ここでreturn numとやってもdef QuestionBoxの中にしか戻らないみたいです。
関数の中の内部関数の戻り値を取り出したいと、タイトルを変更します。

Python

1import tkinter 2import os 3 4def QuestionBox (mes, filename="none", x=50, y=50, width=900, height=150, title="Question", 5 workdir="C:\temp\"): 6 # Tkクラス生成 7 root = tkinter.Tk() 8 root.geometry('{}x{}+{}+{}'.format(width, height, x, y)) 9 root.title(title) 10 root.attributes("-topmost", True) 11 root.option_add('*font', (u'MS ゴシック', 20)) 12 13 # ラベル 14 lbl = tkinter.Label(text=mes) 15 lbl.place(x=30, y=10) 16 17 # テキストボックス 18 # txt = tkinter.Entry(width=7, font="u'MS ゴシック', 20, 'bold'", title="Question") 19 txt = tkinter.Entry(width=7) 20 txt.option_add('*font', (u'MS ゴシック', 20, 'bold')) 21 22 23 txt.place(x=1150, y=15) 24 txt.pack(padx=5, pady=5, anchor=tkinter.SE) 25 # txt.insert(tkinter.END, "3") 26 27 def FlagWright(): 28 num = txt.get() 29 if filename != "none": 30 pathstring = os.path.join(workdir,filename) 31 with open(pathstring, 'w', encoding='utf-8') as file: 32 file.write(num) 33 root.quit() 34 return num 35 36 # button1 = tkinter.Button(root, text='決定', command=lambda: make_cmd(root), 37 button1 = tkinter.Button(root, text='決定', width=10, height=2, command=lambda :FlagWright()) 38 button1.pack(side=tkinter.BOTTOM, padx=5, pady=5, anchor=tkinter.SE) 39 40 root.mainloop() 41

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

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

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

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

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

guest

回答1

0

ベストアンサー

今回 return を返すべきなのは FlagWright()関数ではなくて、 QuestionBox()関数なので

QuestionBox()

Python

1def QuestionBox(): 2 result = None 3 ... 4 return result

のように実装し、FlagWright() ではこの result

Python

1def FlagWright(): 2 nonlocal result 3 ... 4 result = num 5 root.quit()

のようにして書き換えると良いかと思います

投稿2018/11/16 08:33

magichan

総合スコア15898

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

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

Aki1000

2018/11/16 09:06

ありがとうございます。 ところで、いろいろなところでグローバル変数さけるべし、と言う事が書かれているのですが………このnonlocalというのは大丈夫なんでしょうか……… 働きを見るにグローバル変数の一種?
magichan

2018/11/16 09:46

nonlocal も用途としては global変数のようなものですが、global はファイル全体からアクセスできるのに対して、nonlocalはネストされた関数から親のローカル変数にアクセスするのに使用します。 global変数が悪とされるのは「可読性が損なわれる」「誰が何処からどのタイミングで書き換えたのかが分かり難く保守性が低下する」ことかと思います。 nonlocalは書き換えられる範囲も限定的なので、関数を短く簡潔に書けるのであれば可読性も落ちることはないので、それほど悪い選択肢ではないと個人的には思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問