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

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

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

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

Q&A

解決済

1回答

1842閲覧

クラス間の値のやり取り

MATLIB

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2020/10/10 13:20

編集2020/10/11 06:57

クラス間の値のやり取りについてご教授いただきたいです。
例として、サンプルにそって記載します。

<例>
ファイルAとBがあります。
ファイルAのdef print_out(self,event):で取得したid_pathをファイルBで使用してファイルパス(os.curdir)を作成しようとしています。
値とファイルパスを組み合わせて作成する方法は前質問で回答をいただき理解できました。
https://teratail.com/questions/297161

ファイルAで取得したid_pathをファイルBのPathTreeFrameに引数で渡そうと記載してもファイルBのPathTreeFrame側で受け取れないです。
下記に試した結果とエラー内容を記載します。

<試した結果>
#ファイルA
def print_out(self,event):
id_path = self.master.txt_1.get()
PathTreeFrame(self.master,id_path)

#ファイルB
class PathTreeFrame(ttk.Frame):
"""ディレクトリ・ファイルツリーを表示するFrame."""

def __init__(self, master,id_path,path=os.curdir): super().__init__(master) self.root_path = os.path.abspath(path) self.nodes = {} self.create_widgets() self.id_path = id_path

<エラー内容>
TypeError: init() missing 1 required positional argument: 'id_path'

クラス内メソッドは他クラスでは使用できない仕様?

これ以外でも別クラスに値を渡したくてもできない状態です。

クラス間のやり取りについてご教授お願い致します。

#ファイルA import tkinter from tkinter import font import tkinter as tk from test12 import PathTreeFrame class kanja_kaiseki(tkinter.Frame): def __init__(self, master=None, **kwargs): super().__init__(master) self.pack() self.master.geometry("700x400") self.master.title("解析") self.create_widgets() def return_view(self): self.master.destroy() def print_out(self,event): id_path = self.master.txt_1.get()      PathTreeFrame(self.master,id_path) # Create Widgets function def create_widgets(self): # ラベル作成 font1 = font.Font(self.master, size=10) LBL_1= tkinter.Label(self.master, text='ID:', font=font1) LBL_1.place(x=10, y=30) # ラベルを配置する位置の設定 LBL_2 = tkinter.Label(self.master, text='名:', font=font1) LBL_2.place(x=10, y=70) # ラベルを配置する位置の設定 # テキストボックス self.master.txt_1 = tkinter.Entry(self.master, width=20) self.master.txt_1.place(x=70, y=30) self.master.txt_1.bind("<FocusOut>", func=self.print_out) self.master.txt_2 = tkinter.Entry(self.master, width=20) self.master.txt_2.place(x=70, y=70) # ボタン作成 font2 = font.Font(self.master, size=20) font3 = font.Font(self.master, size=15) btn_start = tkinter.Button(self.master,text='開始',font=font2,bg="#faefe6",height=8, width=20) btn_start.place(x=320, y=50) # ボタンを配置する位置の設定 btn_end = tkinter.Button(self.master, text='閉じる',font=font3, width=8,command=self.return_view) btn_end.place(x=410, y=350) # ボタンを配置する位置の設定 app = PathTreeFrame(self.master) # app.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W)) app.place(x=10,y=160) # app.pack(side=tk.LEFT) self.master.bind('<F4>', app.change_dir) self.master.bind('<F5>', app.update_dir) self.master.columnconfigure(0, weight=1) self.master.rowconfigure(0, weight=1) def main(): root = tk.Tk() app = kanja_kaiseki(master=root) app.mainloop() if __name__ == "__main__": main()
# Bファイル import os import tkinter import tkinter as tk import tkinter.ttk as ttk from tkinter import filedialog class PathTreeFrame(ttk.Frame): """ディレクトリ・ファイルツリーを表示するFrame.""" def __init__(self, master,id_path,path=os.curdir): """初期化 args: master: 親ウィジェット path: どのパスを起点にツリーを作るか。デフォルトはカレント8 """ super().__init__(master) self.root_path = os.path.abspath(path) self.nodes = {} self.create_widgets() self.id_path = id_path def create_widgets(self): """ウィジェットの作成""" # ツリービューの作成とスクロール設定 self.tree = ttk.Treeview(self) ysb = ttk.Scrollbar( self, orient=tk.VERTICAL, command=self.tree.yview) self.tree.configure(yscroll=ysb.set) # レイアウト。スクロールバーは拡大させない self.tree.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W)) ysb.grid(row=0, column=1, sticky=(tk.N, tk.S)) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) # ディレクトリを開いた際と、ダブルクリック(ファイル選択)を関連付け self.tree.bind('<<TreeviewOpen>>', self.open_node) self.tree.bind('<Double-1>', self.choose_file) # ルートのパスを挿入 self.insert_node('', self.root_path, self.root_path) def insert_node(self, parent, text, abspath): """Treeviewにノードを追加する args: parent: 親ノード text: 表示するパス名 abspath: 絶対パス """ # まずノードを追加する node = self.tree.insert(parent, 'end', text=text, open=False) # ディレクトリならば、空の子要素を追加し開けるようにしておく if os.path.isdir(abspath): self.tree.insert(node, 'end') self.nodes[node] = (False, abspath) else: self.nodes[node] = (True, abspath) def open_node(self, event): """ディレクトリを開いた際に呼び出される self.nodes[node][0]がFalseの場合はまだ開かれたことがないと判断し、 そのディレクトリ内のパスを追加する 一度開いたか、又はファイルの場合はself.nodes[node][0]はTrueになります """ node = self.tree.focus() already_open, abspath = self.nodes[node] # まだ開かれたことのないディレクトリならば if not already_open: # 空白の要素が追加されているので、消去 self.tree.delete(self.tree.get_children(node)) # ディレクトリ内の全てのファイル・ディレクトリを取得し、Treeviewに追加 for entry in os.scandir(abspath): self.insert_node( node, entry.name, os.path.join(abspath, entry.path) ) # 一度開いたディレクトリはTrueにする self.nodes[node] = (True, abspath) def choose_file(self, event): """ツリーをダブルクリックで呼ばれる""" node = self.tree.focus() # ツリーのノード自体をダブルクリックしているか? if node: already_open, abspath = self.nodes[node] if os.path.isfile(abspath): print(abspath) def update_dir(self, event=None): """ツリーの一覧を更新する""" self.create_widgets() def change_dir(self, event=None): """ツリーのルートディレクトリを変更する""" dir_name = filedialog.askdirectory() if dir_name: self.root_path = dir_name self.create_widgets()
#ファイルC def selected(self): for item in self.master.tree.selection(): print(item, self.master.tree.item(item)) d = self.master.tree.item(item) txt_id = d['values'][0] txt_name = d['values'][1] print(txt_id) print(txt_name) gamen2(self,txt_id,txt_name)
#ファイルD class gamen2(tkinter.Frame): def __init__(self, master=None,txt_id,txt_name,**kwargs): super().__init__(master) self.pack() self.master.geometry("400x300") self.master.title("画面2") self.txt_id = txt_id self.create_widgets()

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーにも記載されている様に、引数が正常に与えられていません。
Bファイルではdef __init__(self, master,id_path,path=os.curdir):
最低限第2引数と第3引数を受け取る様必要があり、Aファイル50行目では第2引数しか与えられていません。
(第4引数に関してはデフォルト引数が与えられている為省略可)
Aファイル22行目でPathTreeFrame(self.master,id_path)と引数を2つ正常に与えている様に
Aファイル50行目でも正しく引数を渡しましょう。

投稿2020/10/11 05:48

編集2020/10/11 06:00
nto

総合スコア1438

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

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

MATLIB

2020/10/11 06:18 編集

50行目では渡す引数はなかったので、とりあえずid_path=""を入れたらできました。 基本的にクラスのインスタンス生成→引数渡すの流れで他クラスで値が使えると認識でよろしいでしょうか?
nto

2020/10/11 06:49

であれば、受け取り側であるBファイルで予めデフォルト引数としてid_path=Noneなどとするのも良いでしょう。 今回のケースの場合では引数として値を渡せばBクラス内で参照する事は可能ですが、直接Aクラスの変数の値を更新する事は出来ません。 クラスの継承や値の書き換えなどについてはまた別途での説明が必要となってしまい、こちらのコメントでは書ききれないです。 以下の記事がわかりやすく非常に参考になると思うので、時間がある際に勉強してください。 その上で躓いた際にでもteratailで回答を求めれば良いと思います。 参考:https://www.headboost.jp/python-class-inheritance/
MATLIB

2020/10/11 06:59

了解致しました。 確認してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問