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

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

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

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

Python

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

Q&A

解決済

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

emanu
emanu

総合スコア2

Python 3.x

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

Python

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

3回答

0グッド

0クリップ

501閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

y_waiwai

2022/03/20 02:08

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

2022/03/20 03:05

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

回答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

総合スコア10486

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

emanu

2022/04/03 10:21

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

2022/04/03 13:26

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

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

総合スコア16263

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

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

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

投稿2022/03/20 02:10

y_waiwai

総合スコア86025

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

emanu

2022/03/20 02:18

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

2022/03/20 02:26

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Python

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