🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

1487閲覧

python メソッド間の要素受け渡しをする

gfkn94

総合スコア14

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2019/11/30 08:24

編集2019/11/30 15:09

メソッド間にて、取得情報の受け渡しをしたい

pythonにてエクスプローラーより選択した複数ファイルパスを取得する処理を作成しておりました。
その際、関数内での取得した値を複数の関数で再利用するためには、クラスというものを使用すると知りました。
ですが、簡易的な記述方法しか理解していないため、今回の処理で難航している状況です。

そもそもこの処理がクラスによって解決するべき問題なのかすら理解出来ていませんが、ご助言ただければ幸いです。

クラスを利用し、取得情報の受け渡しはどのような記述になるか

個人としてはクラスやインスタンスについて調べました。
得られた情報では、引数を指定して計算結果を他のメソッドに受け渡す、という流れは理解しました。
しかし、メソッド内で要素を取得し、逆に受け渡すという処理につまった状態です。

エラーコードも引数についての指摘がされているという事までは分かるのですが、**こちら側から指定する要素がないのに引数を指定する?**という状態です。

そもそも、クラスインスタンス以前の箇所もございます。
どこが問題なのか漠然とした状況であり、学習箇所を見直す機会としてひと言頂ければ幸いです。

TypeError: start_btn() missing 1 required positional argument: 'search_field'

動作内容

def btnRef エクスプローラー起動 要素取得
def btnStart 要素受け渡し後 動作開始

該当のソースコード

おそらく引数の指定は、めちゃくちゃになっているかと思います。

python

1 2# ボタン押下時判定 3class btn_status: 4 5 # initは記載必要? 6 def __init__(self, search_field): 7 pass 8 9 # 【1/2】ファイルパス取得 10 # OSエクスプローラから、複数のファイルパスを取得 11 # 他メソッドで利用できるように戻り値に指定 12 def get_file_path(self): 13 fTyp = [('', '*')] 14 iDir = os.path.abspath(os.path.dirname(__file__)) 15 filepaths = filedialog.askopenfilenames(filetypes=fTyp, initialdir=iDir) 16 # 取得したファイルパス 17 search_field = filePath.set(filepaths) 18 # ファイルパス:search_fieldを戻り値に指定 19 return self.search_field 20 21 # 【2/2】取得したファイル名を表示する 22 def start_btn(self): 23 print(self.search_field) 24 25h = btn_status() 26 27# 実行ボタン部分 28# btnStart = ttk.Button(frameBtn, text='はじめる', command=h.start_btn) 29# btnRef = ttk.Button(root, text=u'参照', command=h.get_file_path) 30

試したこと

self部分の改変
記述方法自体の修正

追記

■動作イメージ図
イメージ説明
ご回答頂いた流れで動作させてみたのですが、処理の部分で気になる点が発生してしまいました。

start_btn()を実行した際に、btnRef_clicked()を呼び出す部分です。
戻り値による受け渡しの流れとしては当然なのですが、処理として見てみると
2度同じ動作をしてしまう形になってしまっております

その上で気になる点が浮かびました

1.クラスを利用すれば、他のメソッドから戻り値のみの要素を取得出来るのでしょうか?

今回の点ですと、search_fieldのリストが欲しいのであって、ファイルパス取得動作が余計に付いてしまっています。
自分の中ではクラス=変数・リストを関数感で共有する方法と認識していました。
そもそもの認識がずれてしまっている可能性があります。

2.現状の問題点を調べる、書籍や関連サイトについてありましたらご助言頂きたいです。

自身の問題点を見直すために、調べ直してみようと思います。
あまりにも漠然とした情報収集のため、関連した分野の記事などがありましたら、非常に助かります。

用語の把握も疎いため、上手く内容を伝達出来ずに申し訳ございません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

クラスにしなくても、リストやタプルを渡せばいいのでは?
リストなら、呼び出した先で要素を追加したり削除したりもできます。

python

1def func1(): 2 pathes = ('/tmp/a', '/tmp/b', '/tmp/c') 3 return pathes 4 5def func2(arg): 6 print(arg) 7 8def main(): 9 pathes = func1() 10 func2(pathes) 11 12if __name__ == '__main__': 13 main()

tk.StringVar() を使った例を示します。

python

1import os 2import tkinter as tk 3import tkinter.filedialog as filedialog 4 5def mail_checker(root): 6 root.title('メールチェッカー') 7 8 search_files = tk.StringVar() 9 10 tk.Label(root, text="メールを読み込んで必要な情報を出力します").pack() 11 12 frame1 = tk.Frame(root) 13 frame1.pack() 14 tk.Label(frame1, text="ファイル名").pack(side='left') 15 tk.Entry(frame1, textvariable=search_files).pack(side='left') 16 tk.Button(frame1, text='参照', command=lambda: search_files.set(select_files())).pack(side='left') 17 18 frame2 = tk.Frame(root) 19 frame2.pack() 20 tk.Button(frame2, text='はじめる', command=lambda: start(search_files.get())).pack(side='left') 21 tk.Button(frame2, text='Cancel', command=root.quit).pack(side='left') 22 23def select_files(): 24 fTyp = [('', '*')] 25 iDir = os.path.abspath(os.path.dirname(__file__)) 26 return filedialog.askopenfilenames(filetypes=fTyp, initialdir=iDir) 27 28def start(files): 29 print(files) 30 31def main(): 32 root = tk.Tk() 33 mail_checker(root) 34 root.mainloop() 35 36if __name__ == '__main__': 37 main()

投稿2019/11/30 10:04

編集2019/11/30 17:27
shiracamus

総合スコア5406

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

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

gfkn94

2019/11/30 15:18

貴重なお時間より、ご回答ありがとうございます。 内容の処理を参考に、今一度実行してみました。 しかし、内部で2重に処理がされてしまう箇所が発見されてしまいました。 ■以下 - - - def main(): pathes = func1() func2(pathes) - - - 戻り値の処理では当然なのですが・・・。 すでに別の「ボタンA」より、func1は実行済みの状態でありまして。 「ボタンB」を押下した場合は、func2を実行し、func1の「戻り値のみ=リスト」を取得したい状況です。 func1をそのまま利用してしまうと、「ファイルパス取得動作」まで発生してしまい、2重に動作するという問題が発生してしまいました。 その点を踏まえて質問事項に、追記を致しました。 もしお時間があるようでしたら、都合の宜しいときで結構ですので、現状の問題点に付いてのご意見を頂けるとありがたいです。
shiracamus

2019/11/30 17:27

サンプルコードを回答欄に追記しました。
gfkn94

2019/12/01 13:43

ご丁寧にサンプルまで制作していただき、とても助かりました。 理想通りの結果になりました。 Lambda関数というものがあるのですね、今後利用していこうと思います。 クラスがなくても処理の受け渡しでは問題なかったのですね、改めて今後の課題として学んでいきます。 この度は、夜遅くまでお付き合いいただきまして誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問