クラス間の値のやり取りについてご教授いただきたいです。
例として、サンプルにそって記載します。
<例>
ファイル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()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/11 06:18 編集
2020/10/11 06:49
2020/10/11 06:59