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

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

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

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

Python

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

Q&A

解決済

3回答

771閲覧

Python 関数 条件分岐による戻り値について

emanu

総合スコア2

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/03/20 01:59

編集2022/03/20 02:25

実現したいこと

PySimpleGUIを使用し、ファイルを二つ選択し、「読み込み開始」ボタンを押すとファイルの読み込みを開始するGUIを作成しています。
それぞれのファイルが未選択、またはファイル形式外(テキストファイルのみ選択可能な仕様にしています)の場合、エラーメッセージを表示するようにしています。
どちらも正常なファイルが選択された場合、次の処理(ファイルの読み込み等)に進みたいと考えているのですが、現状のコードだとどちらもTrueの場合にエラーとなってしまいます。
ファイル選択時ではなく、ファイルの読み込み等の処理が完了したらcode = '0'で終了したいと考えています。
異常がある場合のみエラーコードと、エラーメッセージを返却するようにしたいです。

filesample.py(GUI画面)

1import PySimpleGUI as sg 2import file_function as ff 3from file_select import FileSelect 4sg.theme('Dark Brown') 5layout = [ 6 [sg.Text('1つ目のファイルのを選択してください'),sg.InputText(key='FILE1', size=(45,1)), sg.FileBrowse('参照', target='FILE1')], 7 [sg.Text('1つ目のファイルのを選択してください'),sg.InputText(key='FILE2', size=(45,1)), sg.FileBrowse('参照', target='FILE2')], 8 [sg.Button('読み込み開始',key=FileSelect.START)], 9 [sg.CloseButton('閉じる')] 10] 11window = sg.Window('ファイル選択サンプル', layout) 12while True: 13 event, values = window.read() 14 if event == sg.WIN_CLOSED: 15 break 16 code, message = ff.file_func(event,values['FILE1'], values['FILE2']) 17 #if code = '0': 18 # sg.popup_ok(message,title='ファイルの読み込み完了' 19 if code == '1': 20 sg.popup_error(message, title='選択エラー') 21window.close()

file_function.py

1import PySimpleGUI as sg 2import os 3from file_select import FileSelect 4def file_func(event, first_file_path,second_file_path): 5 first_file_state = False 6 if first_file_path == '': 7 first_file_message = "1つめが選択されていません。" 8 elif os.path.splitext(first_file_path)[1] != '.txt': 9 first_file_message = "1つめがテキストファイルではありません。" 10 second_file_state = False 11 if second_file_path == '': 12 second_file_message = "2つめが選択されていません。" 13 elif os.path.splitext(second_file_path)[1] != '.txt': 14 second_file_message = "2つめがテキストファイルではありません" 15 if (first_file_state == False) or (second_file_state == False): 16 code = "1" 17 return code, f"{first_file_message}\n{second_file_message}" 18 19#ファイルの読み込みの処理記載予定 20# code = "0"

試したこと

file_functionの15行目if条件の変更で、
どちらもTrueだったら何もしないという意味でpassを入れたり色々試しているのですがうまくいかず・・・アドバイスをいただきたいです。

file_function.py

1if first_file_state and second_file_state: 2 pass 3else: 4 code = "1" 5

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

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

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

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

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

y_waiwai

2022/03/20 02:08

なにがどういうふうにうまく行かないのかを説明しよう
quickquip

2022/03/20 03:05

> 異常がある場合のみエラーコードと、エラーメッセージを返却するようにしたいです。 この部分が、「やりたいこと」に対する「正しくない解決方法」なせいで回答できない質問になっているように思います。 https://ja.meta.stackoverflow.com/questions/2701/#answer-2702
guest

回答3

0

ベストアンサー

前の質問で回答しましたが、処理の内容を理解不十分なので、コードのロジックが間違えています。

python

1 first_file_state = False1 2 if first_file_path == '':2 3 first_file_message = "1つめが選択されていません。" 4 elif os.path.splitext(first_file_path)[1] != '.txt':3 5 first_file_message = "1つめがテキストファイルではありません。" 6 else:4 7 first_file_state = True5

提示したコードは1つめのファイルの判定の部分です。
「first_file_state」変数は、1つめのファイルの判定結果を表わしています。
この処理では、始め(★1)で判定結果をNG(False)としています。これは今回の判定が「だめでなければOK」という方式だからです。
その後if文で、NGの条件をチェックしていくわけです。 ★2 ★3 NGにひっかかれば、first_file_stateはなにもせずそのままです。(メッセージは設定しています)
で、質問にあるコードはここまでで終りです。 これでは、問題なかったことを判定できません。
判定するには、★4 のように else節を付けて、そこでfirst_file_stateをTrueにしてやる必要があります。

この方式がわかりにくいということであれば、ロジックを逆にしてはどうでしょうか。

python

1 first_file_state = True1 2 if first_file_path == '':2 3 first_file_state = False 4 first_file_message = "1つめが選択されていません。" 5 elif os.path.splitext(first_file_path)[1] != '.txt':3 6 first_file_state = False 7 first_file_message = "1つめがテキストファイルではありません。"

始めに first_file_state の値 をTrueにしておいて、チェックしてNGであれば、Falseにする方式です。

判定が正しくできていれば、以下のように判定できます。
ただし、ここもelse節でcode="0"を設定する必要があります。

python

1 if (first_file_state == False) or (second_file_state == False): 2 code = "1" 3else: 4 code = "0" 5 return code, f"{first_file_message}\n{second_file_message}"

投稿2022/03/20 05:42

TakaiY

総合スコア12765

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

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

emanu

2022/04/03 10:21

何度もご回答本当にありがとうございました。 ステータスではなく、メッセージをリストに追加する方式でメッセージの長さが0以上の場合はリターンすることで異常がある場合のみ戻すことができました。
TakaiY

2022/04/03 13:26

解決して納得ということであればいいのですが、メッセージが空であればOKという判定の方式はいい方法とは言えません。きちんと状態管理すべきだと思います。
guest

0

file_function.py

python

1import os 2 3def file_func(event, first_file_path,second_file_path): 4 first_file_state = second_file_state = False 5 first_file_message = second_file_message = '' 6 7 if first_file_path == '': 8 first_file_message = "1つめが選択されていません。" 9 elif os.path.splitext(first_file_path)[1] != '.txt': 10 first_file_message = "1つめがテキストファイルではありません。" 11 else: 12 first_file_state = True 13 14 if second_file_path == '': 15 second_file_message = "2つめが選択されていません。" 16 elif os.path.splitext(second_file_path)[1] != '.txt': 17 second_file_message = "2つめがテキストファイルではありません" 18 else: 19 second_file_state = True 20 21 if first_file_state and second_file_state: 22 return True, '' 23 else: 24 return False, '\n'.join((first_file_message, second_file_message))

filesample.py

python

1import PySimpleGUI as sg 2import file_function as ff 3from file_select import FileSelect 4 5sg.theme('Dark Brown') 6layout = [ 7 [sg.Text('1つ目のファイルのを選択してください'),sg.InputText(key='FILE1', size=(45,1)), sg.FileBrowse('参照', target='FILE1')], 8 [sg.Text('1つ目のファイルのを選択してください'),sg.InputText(key='FILE2', size=(45,1)), sg.FileBrowse('参照', target='FILE2')], 9 [sg.Button('読み込み開始',key=FileSelect.START)], 10 [sg.CloseButton('閉じる')] 11] 12 13window = sg.Window('ファイル選択サンプル', layout) 14while True: 15 event, values = window.read() 16 if event == sg.WIN_CLOSED: 17 break 18 code, message = ff.file_func(event,values['FILE1'], values['FILE2']) 19 if code: 20 sg.popup_ok(message, title='ファイルの読み込み完了') 21 else: 22 sg.popup_error(message, title='選択エラー') 23 24window.close()

投稿2022/03/20 03:40

melian

総合スコア19803

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

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

0

とりあえず、そのifが不成立のときにはcodeと言う変数が未定義になってしまいますね

不成立のときにはcodeはどのようにしたいんでしょうか

投稿2022/03/20 02:10

y_waiwai

総合スコア87774

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

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

emanu

2022/03/20 02:18

コメントくださりありがとうございます。 ifが不成立の場合(どちらも正常なファイルが選択されていた場合)は、コードを返さず、ファイル選択ミスの場合にだけポップアップに遷移したいと考えています。if不成立の場合はfile_functionでファイルの読み込みを開始する処理に続きたいのですが、ご説明になっておりますでしょうか。
y_waiwai

2022/03/20 02:26

いや、私が言ってるのは、そのコードがエラーになってしまうってことです。 エラーでプログラムを落としたいってことなら、いまのまま未定義でもいいですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問