質問編集履歴

6

内容修正

2020/10/11 06:57

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -433,3 +433,53 @@
433
433
 
434
434
 
435
435
  ```
436
+
437
+
438
+
439
+ ```ここに言語を入力
440
+
441
+ #ファイルC
442
+
443
+ def selected(self):
444
+
445
+ for item in self.master.tree.selection():
446
+
447
+ print(item, self.master.tree.item(item))
448
+
449
+ d = self.master.tree.item(item)
450
+
451
+ txt_id = d['values'][0]
452
+
453
+ txt_name = d['values'][1]
454
+
455
+ print(txt_id)
456
+
457
+ print(txt_name)
458
+
459
+ gamen2(self,txt_id,txt_name)
460
+
461
+ ```
462
+
463
+ ```ここに言語を入力
464
+
465
+ #ファイルD
466
+
467
+ class gamen2(tkinter.Frame):
468
+
469
+ def __init__(self, master=None,txt_id,txt_name,**kwargs):
470
+
471
+ super().__init__(master)
472
+
473
+ self.pack()
474
+
475
+
476
+
477
+ self.master.geometry("400x300")
478
+
479
+ self.master.title("画面2")
480
+
481
+ self.txt_id = txt_id
482
+
483
+ self.create_widgets()
484
+
485
+ ```

5

内容修正

2020/10/11 06:56

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -44,6 +44,198 @@
44
44
 
45
45
  def __init__(self, master,id_path,path=os.curdir):
46
46
 
47
+ super().__init__(master)
48
+
49
+ self.root_path = os.path.abspath(path)
50
+
51
+ self.nodes = {}
52
+
53
+ self.create_widgets()
54
+
55
+ self.id_path = id_path
56
+
57
+
58
+
59
+ <エラー内容>
60
+
61
+ TypeError: __init__() missing 1 required positional argument: 'id_path'
62
+
63
+
64
+
65
+ クラス内メソッドは他クラスでは使用できない仕様?
66
+
67
+
68
+
69
+ これ以外でも別クラスに値を渡したくてもできない状態です。
70
+
71
+
72
+
73
+ クラス間のやり取りについてご教授お願い致します。
74
+
75
+
76
+
77
+ ```ここに言語を入力
78
+
79
+ #ファイルA
80
+
81
+
82
+
83
+ import tkinter
84
+
85
+ from tkinter import font
86
+
87
+ import tkinter as tk
88
+
89
+ from test12 import PathTreeFrame
90
+
91
+
92
+
93
+ class kanja_kaiseki(tkinter.Frame):
94
+
95
+ def __init__(self, master=None, **kwargs):
96
+
97
+ super().__init__(master)
98
+
99
+ self.pack()
100
+
101
+ self.master.geometry("700x400")
102
+
103
+ self.master.title("解析")
104
+
105
+
106
+
107
+ self.create_widgets()
108
+
109
+
110
+
111
+ def return_view(self):
112
+
113
+ self.master.destroy()
114
+
115
+
116
+
117
+ def print_out(self,event):
118
+
119
+ id_path = self.master.txt_1.get()
120
+
121
+      PathTreeFrame(self.master,id_path)
122
+
123
+
124
+
125
+ # Create Widgets function
126
+
127
+ def create_widgets(self):
128
+
129
+
130
+
131
+ # ラベル作成
132
+
133
+ font1 = font.Font(self.master, size=10)
134
+
135
+ LBL_1= tkinter.Label(self.master, text='ID:', font=font1)
136
+
137
+ LBL_1.place(x=10, y=30) # ラベルを配置する位置の設定
138
+
139
+ LBL_2 = tkinter.Label(self.master, text='名:', font=font1)
140
+
141
+ LBL_2.place(x=10, y=70) # ラベルを配置する位置の設定
142
+
143
+
144
+
145
+ # テキストボックス
146
+
147
+ self.master.txt_1 = tkinter.Entry(self.master, width=20)
148
+
149
+ self.master.txt_1.place(x=70, y=30)
150
+
151
+ self.master.txt_1.bind("<FocusOut>", func=self.print_out)
152
+
153
+ self.master.txt_2 = tkinter.Entry(self.master, width=20)
154
+
155
+ self.master.txt_2.place(x=70, y=70)
156
+
157
+
158
+
159
+
160
+
161
+ # ボタン作成
162
+
163
+ font2 = font.Font(self.master, size=20)
164
+
165
+ font3 = font.Font(self.master, size=15)
166
+
167
+ btn_start = tkinter.Button(self.master,text='開始',font=font2,bg="#faefe6",height=8, width=20)
168
+
169
+ btn_start.place(x=320, y=50) # ボタンを配置する位置の設定
170
+
171
+ btn_end = tkinter.Button(self.master, text='閉じる',font=font3, width=8,command=self.return_view)
172
+
173
+ btn_end.place(x=410, y=350) # ボタンを配置する位置の設定
174
+
175
+
176
+
177
+ app = PathTreeFrame(self.master)
178
+
179
+ # app.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
180
+
181
+ app.place(x=10,y=160)
182
+
183
+ # app.pack(side=tk.LEFT)
184
+
185
+ self.master.bind('<F4>', app.change_dir)
186
+
187
+ self.master.bind('<F5>', app.update_dir)
188
+
189
+ self.master.columnconfigure(0, weight=1)
190
+
191
+ self.master.rowconfigure(0, weight=1)
192
+
193
+
194
+
195
+ def main():
196
+
197
+ root = tk.Tk()
198
+
199
+ app = kanja_kaiseki(master=root)
200
+
201
+ app.mainloop()
202
+
203
+
204
+
205
+ if __name__ == "__main__":
206
+
207
+ main()
208
+
209
+ ```
210
+
211
+
212
+
213
+ ```ここに言語を入力
214
+
215
+ # Bファイル
216
+
217
+
218
+
219
+ import os
220
+
221
+ import tkinter
222
+
223
+ import tkinter as tk
224
+
225
+ import tkinter.ttk as ttk
226
+
227
+ from tkinter import filedialog
228
+
229
+
230
+
231
+ class PathTreeFrame(ttk.Frame):
232
+
233
+ """ディレクトリ・ファイルツリーを表示するFrame."""
234
+
235
+
236
+
237
+ def __init__(self, master,id_path,path=os.curdir):
238
+
47
239
  """初期化
48
240
 
49
241
 
@@ -68,382 +260,176 @@
68
260
 
69
261
  self.id_path = id_path
70
262
 
71
-
72
-
73
- <エラー内容>
74
-
75
- TypeError: __init__() missing 1 required positional argument: 'id_path'
76
-
77
-
78
-
79
- クラス内メソッドは他クラスでは使用できない仕様?
80
-
81
-
82
-
83
- これ以外でも別クラスに値を渡したくてもできない状態です。
84
-
85
-
86
-
87
- ラス間のやり取りにつてご教授お願い致します。
88
-
89
-
90
-
91
- ```ここに言語を入力
92
-
93
- #ファイルA
94
-
95
-
96
-
97
- import tkinter
98
-
99
- from tkinter import font
100
-
101
- import tkinter as tk
102
-
103
- from test12 import PathTreeFrame
104
-
105
-
106
-
107
- class kanja_kaiseki(tkinter.Frame):
108
-
109
- def __init__(self, master=None, **kwargs):
110
-
111
- super().__init__(master)
112
-
113
- self.pack()
114
-
115
- self.master.geometry("700x400")
116
-
117
- self.master.title("解析")
118
-
119
-
263
+ def create_widgets(self):
264
+
265
+ """ウィジェットの作成"""
266
+
267
+ # ツリービューの作成とスクロール設定
268
+
269
+ self.tree = ttk.Treeview(self)
270
+
271
+ ysb = ttk.Scrollbar(
272
+
273
+ self, orient=tk.VERTICAL, command=self.tree.yview)
274
+
275
+ self.tree.configure(yscroll=ysb.set)
276
+
277
+
278
+
279
+ # レイアウト。スロールバーは拡大させな
280
+
281
+ self.tree.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
282
+
283
+ ysb.grid(row=0, column=1, sticky=(tk.N, tk.S))
284
+
285
+ self.columnconfigure(0, weight=1)
286
+
287
+ self.rowconfigure(0, weight=1)
288
+
289
+
290
+
291
+ # ディレクトリを開いた際と、ダブルクリック(ファイル選択)を関連付け
292
+
293
+ self.tree.bind('<<TreeviewOpen>>', self.open_node)
294
+
295
+ self.tree.bind('<Double-1>', self.choose_file)
296
+
297
+
298
+
299
+ # ルートのパスを挿入
300
+
301
+ self.insert_node('', self.root_path, self.root_path)
302
+
303
+
304
+
305
+ def insert_node(self, parent, text, abspath):
306
+
307
+ """Treeviewにノードを追加する
308
+
309
+
310
+
311
+ args:
312
+
313
+ parent: 親ノード
314
+
315
+ text: 表示するパス名
316
+
317
+ abspath: 絶対パス
318
+
319
+
320
+
321
+ """
322
+
323
+ # まずノードを追加する
324
+
325
+ node = self.tree.insert(parent, 'end', text=text, open=False)
326
+
327
+
328
+
329
+ # ディレクトリならば、空の子要素を追加し開けるようにしておく
330
+
331
+ if os.path.isdir(abspath):
332
+
333
+ self.tree.insert(node, 'end')
334
+
335
+ self.nodes[node] = (False, abspath)
336
+
337
+ else:
338
+
339
+ self.nodes[node] = (True, abspath)
340
+
341
+
342
+
343
+ def open_node(self, event):
344
+
345
+ """ディレクトリを開いた際に呼び出される
346
+
347
+
348
+
349
+ self.nodes[node][0]がFalseの場合はまだ開かれたことがないと判断し、
350
+
351
+ そのディレクトリ内のパスを追加する
352
+
353
+ 一度開いたか、又はファイルの場合はself.nodes[node][0]はTrueになります
354
+
355
+
356
+
357
+ """
358
+
359
+ node = self.tree.focus()
360
+
361
+ already_open, abspath = self.nodes[node]
362
+
363
+
364
+
365
+ # まだ開かれたことのないディレクトリならば
366
+
367
+ if not already_open:
368
+
369
+
370
+
371
+ # 空白の要素が追加されているので、消去
372
+
373
+ self.tree.delete(self.tree.get_children(node))
374
+
375
+
376
+
377
+ # ディレクトリ内の全てのファイル・ディレクトリを取得し、Treeviewに追加
378
+
379
+ for entry in os.scandir(abspath):
380
+
381
+ self.insert_node(
382
+
383
+ node, entry.name, os.path.join(abspath, entry.path)
384
+
385
+ )
386
+
387
+
388
+
389
+ # 一度開いたディレクトリはTrueにする
390
+
391
+ self.nodes[node] = (True, abspath)
392
+
393
+
394
+
395
+ def choose_file(self, event):
396
+
397
+ """ツリーをダブルクリックで呼ばれる"""
398
+
399
+ node = self.tree.focus()
400
+
401
+ # ツリーのノード自体をダブルクリックしているか?
402
+
403
+ if node:
404
+
405
+ already_open, abspath = self.nodes[node]
406
+
407
+ if os.path.isfile(abspath):
408
+
409
+ print(abspath)
410
+
411
+
412
+
413
+ def update_dir(self, event=None):
414
+
415
+ """ツリーの一覧を更新する"""
120
416
 
121
417
  self.create_widgets()
122
418
 
123
419
 
124
420
 
125
- def return_view(self):
126
-
127
- self.master.destroy()
128
-
129
-
130
-
131
- def print_out(self,event):
421
+ def change_dir(self, event=None):
422
+
132
-
423
+ """ツリーのルートディレクトリを変更する"""
424
+
133
- id_path = self.master.txt_1.get()
425
+ dir_name = filedialog.askdirectory()
134
-
426
+
135
-      PathTreeFrame(self.master,id_path)
427
+ if dir_name:
136
-
137
-
138
-
428
+
139
- # Create Widgets function
429
+ self.root_path = dir_name
140
-
430
+
141
- def create_widgets(self):
431
+ self.create_widgets()
142
-
143
-
144
-
145
- # ラベル作成
432
+
146
-
147
- font1 = font.Font(self.master, size=10)
433
+
148
-
149
- LBL_1= tkinter.Label(self.master, text='ID:', font=font1)
150
-
151
- LBL_1.place(x=10, y=30) # ラベルを配置する位置の設定
152
-
153
- LBL_2 = tkinter.Label(self.master, text='名:', font=font1)
154
-
155
- LBL_2.place(x=10, y=70) # ラベルを配置する位置の設定
156
-
157
-
158
-
159
- # テキストボックス
160
-
161
- self.master.txt_1 = tkinter.Entry(self.master, width=20)
162
-
163
- self.master.txt_1.place(x=70, y=30)
164
-
165
- self.master.txt_1.bind("<FocusOut>", func=self.print_out)
166
-
167
- self.master.txt_2 = tkinter.Entry(self.master, width=20)
168
-
169
- self.master.txt_2.place(x=70, y=70)
170
-
171
-
172
-
173
-
174
-
175
- # ボタン作成
176
-
177
- font2 = font.Font(self.master, size=20)
178
-
179
- font3 = font.Font(self.master, size=15)
180
-
181
- btn_start = tkinter.Button(self.master,text='開始',font=font2,bg="#faefe6",height=8, width=20)
182
-
183
- btn_start.place(x=320, y=50) # ボタンを配置する位置の設定
184
-
185
- btn_end = tkinter.Button(self.master, text='閉じる',font=font3, width=8,command=self.return_view)
186
-
187
- btn_end.place(x=410, y=350) # ボタンを配置する位置の設定
188
-
189
-
190
-
191
- app = PathTreeFrame(self.master)
192
-
193
- # app.grid(column=0, row=0, sticky=(tk.N, tk.S, tk.E, tk.W))
194
-
195
- app.place(x=10,y=160)
196
-
197
- # app.pack(side=tk.LEFT)
198
-
199
- self.master.bind('<F4>', app.change_dir)
200
-
201
- self.master.bind('<F5>', app.update_dir)
202
-
203
- self.master.columnconfigure(0, weight=1)
204
-
205
- self.master.rowconfigure(0, weight=1)
206
-
207
-
208
-
209
- def main():
210
-
211
- root = tk.Tk()
212
-
213
- app = kanja_kaiseki(master=root)
214
-
215
- app.mainloop()
216
-
217
-
218
-
219
- if __name__ == "__main__":
220
-
221
- main()
222
434
 
223
435
  ```
224
-
225
-
226
-
227
- ```ここに言語を入力
228
-
229
- # Bファイル
230
-
231
-
232
-
233
- import os
234
-
235
- import tkinter
236
-
237
- import tkinter as tk
238
-
239
- import tkinter.ttk as ttk
240
-
241
- from tkinter import filedialog
242
-
243
-
244
-
245
- class PathTreeFrame(ttk.Frame):
246
-
247
- """ディレクトリ・ファイルツリーを表示するFrame."""
248
-
249
-
250
-
251
- def __init__(self, master,id_path,path=os.curdir):
252
-
253
- """初期化
254
-
255
-
256
-
257
- args:
258
-
259
- master: 親ウィジェット
260
-
261
- path: どのパスを起点にツリーを作るか。デフォルトはカレント8
262
-
263
-
264
-
265
- """
266
-
267
- super().__init__(master)
268
-
269
- self.root_path = os.path.abspath(path)
270
-
271
- self.nodes = {}
272
-
273
- self.create_widgets()
274
-
275
- self.id_path = id_path
276
-
277
- def create_widgets(self):
278
-
279
- """ウィジェットの作成"""
280
-
281
- # ツリービューの作成とスクロール設定
282
-
283
- self.tree = ttk.Treeview(self)
284
-
285
- ysb = ttk.Scrollbar(
286
-
287
- self, orient=tk.VERTICAL, command=self.tree.yview)
288
-
289
- self.tree.configure(yscroll=ysb.set)
290
-
291
-
292
-
293
- # レイアウト。スクロールバーは拡大させない
294
-
295
- self.tree.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
296
-
297
- ysb.grid(row=0, column=1, sticky=(tk.N, tk.S))
298
-
299
- self.columnconfigure(0, weight=1)
300
-
301
- self.rowconfigure(0, weight=1)
302
-
303
-
304
-
305
- # ディレクトリを開いた際と、ダブルクリック(ファイル選択)を関連付け
306
-
307
- self.tree.bind('<<TreeviewOpen>>', self.open_node)
308
-
309
- self.tree.bind('<Double-1>', self.choose_file)
310
-
311
-
312
-
313
- # ルートのパスを挿入
314
-
315
- self.insert_node('', self.root_path, self.root_path)
316
-
317
-
318
-
319
- def insert_node(self, parent, text, abspath):
320
-
321
- """Treeviewにノードを追加する
322
-
323
-
324
-
325
- args:
326
-
327
- parent: 親ノード
328
-
329
- text: 表示するパス名
330
-
331
- abspath: 絶対パス
332
-
333
-
334
-
335
- """
336
-
337
- # まずノードを追加する
338
-
339
- node = self.tree.insert(parent, 'end', text=text, open=False)
340
-
341
-
342
-
343
- # ディレクトリならば、空の子要素を追加し開けるようにしておく
344
-
345
- if os.path.isdir(abspath):
346
-
347
- self.tree.insert(node, 'end')
348
-
349
- self.nodes[node] = (False, abspath)
350
-
351
- else:
352
-
353
- self.nodes[node] = (True, abspath)
354
-
355
-
356
-
357
- def open_node(self, event):
358
-
359
- """ディレクトリを開いた際に呼び出される
360
-
361
-
362
-
363
- self.nodes[node][0]がFalseの場合はまだ開かれたことがないと判断し、
364
-
365
- そのディレクトリ内のパスを追加する
366
-
367
- 一度開いたか、又はファイルの場合はself.nodes[node][0]はTrueになります
368
-
369
-
370
-
371
- """
372
-
373
- node = self.tree.focus()
374
-
375
- already_open, abspath = self.nodes[node]
376
-
377
-
378
-
379
- # まだ開かれたことのないディレクトリならば
380
-
381
- if not already_open:
382
-
383
-
384
-
385
- # 空白の要素が追加されているので、消去
386
-
387
- self.tree.delete(self.tree.get_children(node))
388
-
389
-
390
-
391
- # ディレクトリ内の全てのファイル・ディレクトリを取得し、Treeviewに追加
392
-
393
- for entry in os.scandir(abspath):
394
-
395
- self.insert_node(
396
-
397
- node, entry.name, os.path.join(abspath, entry.path)
398
-
399
- )
400
-
401
-
402
-
403
- # 一度開いたディレクトリはTrueにする
404
-
405
- self.nodes[node] = (True, abspath)
406
-
407
-
408
-
409
- def choose_file(self, event):
410
-
411
- """ツリーをダブルクリックで呼ばれる"""
412
-
413
- node = self.tree.focus()
414
-
415
- # ツリーのノード自体をダブルクリックしているか?
416
-
417
- if node:
418
-
419
- already_open, abspath = self.nodes[node]
420
-
421
- if os.path.isfile(abspath):
422
-
423
- print(abspath)
424
-
425
-
426
-
427
- def update_dir(self, event=None):
428
-
429
- """ツリーの一覧を更新する"""
430
-
431
- self.create_widgets()
432
-
433
-
434
-
435
- def change_dir(self, event=None):
436
-
437
- """ツリーのルートディレクトリを変更する"""
438
-
439
- dir_name = filedialog.askdirectory()
440
-
441
- if dir_name:
442
-
443
- self.root_path = dir_name
444
-
445
- self.create_widgets()
446
-
447
-
448
-
449
- ```

4

追記

2020/10/11 05:43

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -76,6 +76,10 @@
76
76
 
77
77
 
78
78
 
79
+ クラス内メソッドは他クラスでは使用できない仕様?
80
+
81
+
82
+
79
83
  これ以外でも別クラスに値を渡したくてもできない状態です。
80
84
 
81
85
 

3

追記

2020/10/11 03:41

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,62 @@
18
18
 
19
19
  ファイルAで取得したid_pathをファイルBのPathTreeFrameに引数で渡そうと記載してもファイルBのPathTreeFrame側で受け取れないです。
20
20
 
21
+ 下記に試した結果とエラー内容を記載します。
22
+
23
+
24
+
25
+ <試した結果>
26
+
27
+ #ファイルA
28
+
29
+ def print_out(self,event):
30
+
31
+ id_path = self.master.txt_1.get()
32
+
33
+ PathTreeFrame(self.master,id_path)
34
+
35
+
36
+
37
+ #ファイルB
38
+
39
+ class PathTreeFrame(ttk.Frame):
40
+
41
+ """ディレクトリ・ファイルツリーを表示するFrame."""
42
+
43
+
44
+
45
+ def __init__(self, master,id_path,path=os.curdir):
46
+
47
+ """初期化
48
+
49
+
50
+
51
+ args:
52
+
53
+ master: 親ウィジェット
54
+
55
+ path: どのパスを起点にツリーを作るか。デフォルトはカレント8
56
+
57
+
58
+
59
+ """
60
+
61
+ super().__init__(master)
62
+
63
+ self.root_path = os.path.abspath(path)
64
+
65
+ self.nodes = {}
66
+
67
+ self.create_widgets()
68
+
69
+ self.id_path = id_path
70
+
71
+
72
+
73
+ <エラー内容>
74
+
75
+ TypeError: __init__() missing 1 required positional argument: 'id_path'
76
+
21
77
 
22
78
 
23
79
  これ以外でも別クラスに値を渡したくてもできない状態です。
@@ -72,6 +128,8 @@
72
128
 
73
129
  id_path = self.master.txt_1.get()
74
130
 
131
+      PathTreeFrame(self.master,id_path)
132
+
75
133
 
76
134
 
77
135
  # Create Widgets function
@@ -186,7 +244,7 @@
186
244
 
187
245
 
188
246
 
189
- def __init__(self, master,path=os.curdir):
247
+ def __init__(self, master,id_path,path=os.curdir):
190
248
 
191
249
  """初期化
192
250
 
@@ -210,6 +268,8 @@
210
268
 
211
269
  self.create_widgets()
212
270
 
271
+ self.id_path = id_path
272
+
213
273
  def create_widgets(self):
214
274
 
215
275
  """ウィジェットの作成"""

2

2020/10/11 02:20

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- ご教授お願い致します。
27
+ クラス間のやり取りについてご教授お願い致します。
28
28
 
29
29
 
30
30
 

1

2020/10/11 01:12

投稿

MATLIB
MATLIB

スコア27

test CHANGED
File without changes
test CHANGED
@@ -8,9 +8,7 @@
8
8
 
9
9
  ファイルAとBがあります。
10
10
 
11
- ファイルAのdef print_out(self,event):で取得したid_pathを
11
+ ファイルAのdef print_out(self,event):で取得したid_pathをファイルBで使用してファイルパス(os.curdir)を作成しようとしています。
12
-
13
- ファイルBで使用してファイルパス(os.curdir)を作成しようとしています。
14
12
 
15
13
  値とファイルパスを組み合わせて作成する方法は前質問で回答をいただき理解できました。
16
14
 
@@ -18,9 +16,7 @@
18
16
 
19
17
 
20
18
 
21
- ファイルAで取得したid_pathをファイルBのPathTreeFrameに引数で渡そうと記載しても
19
+ ファイルAで取得したid_pathをファイルBのPathTreeFrameに引数で渡そうと記載してもファイルBのPathTreeFrame側で受け取れないです。
22
-
23
- ファイルBのPathTreeFrame側で受け取れないです。
24
20
 
25
21
 
26
22