teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

よくある問題へのリンクを追加

2020/07/08 23:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  関連付けるのオブジェクトを束縛できます。
5
5
 
6
6
  簡易的には lambda を使っても同様の事は可能ですが、
7
- for文内で扱う場合は変数スコープの問題があるので partial推奨
7
+ [for文内で扱う場合は変数スコープの問題](https://docs.python.org/ja/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result)があるので partial推奨
8
8
 
9
9
  ```python
10
10
 

2

サンプルコード手入れ

2020/07/08 23:43

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -43,6 +43,8 @@
43
43
  インスタンス変数で関連付けられたウィジェットにアクセスできます。
44
44
 
45
45
  ```python
46
+ #!/usr/bin/env python3.8
47
+
46
48
  import os
47
49
  import tkinter as tk
48
50
  from tkinter import ttk
@@ -57,6 +59,7 @@
57
59
  visibleVar = self._visible = tk.BooleanVar()
58
60
  filepathVar = self._filepath = tk.StringVar()
59
61
 
62
+ self["text"] = dataName
60
63
  filepathVar.trace("w", self.onFilepathChanged)
61
64
 
62
65
  check = tk.Checkbutton(self, variable=visibleVar)
@@ -68,10 +71,15 @@
68
71
  for w in [check, entry, button1, button2]:
69
72
  w.pack(side=tk.LEFT)
70
73
 
74
+ @property
75
+ def filepath(self):
76
+ return self._filepath.get()
77
+
71
78
  def onFilepathChanged(self, *args):
72
- filepath = self._filepath.get()
79
+ #filepath = self._filepath.get()
73
- dataName = os.path.splitext(os.path.basename(filepath))[0]
80
+ #dataName = os.path.splitext(os.path.basename(filepath))[0]
74
- self.config(text=dataName)
81
+ #self.config(text=dataName)
82
+ self.event_generate("<<FileInputField_filepathChanged>>")
75
83
 
76
84
  def selectFile(self):
77
85
  filepath = askopenfilename(filetypes=[("", "*.csv")])
@@ -84,14 +92,21 @@
84
92
  event.widget.config(bg=color)
85
93
 
86
94
 
95
+ def changed(event):
96
+ if isinstance(event.widget, FileInputField):
97
+ print(event.widget.filepath)
98
+
99
+
87
100
  def main():
88
101
  root = tk.Tk()
89
102
  for dataName, color in zip(["Data1", "Data2", "Data3"], ["red", "green", "blue"]):
90
- FileInputField(root, dataName, color).pack()
103
+ field = FileInputField(root, dataName, color)
91
-
104
+ field.bind("<<FileInputField_filepathChanged>>", changed)
105
+ field.pack()
92
106
  root.mainloop()
93
107
 
94
108
 
95
109
  if __name__ == '__main__':
96
110
  main()
111
+
97
112
  ```

1

説明補足

2020/07/08 18:40

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -36,8 +36,10 @@
36
36
  ```
37
37
 
38
38
  ----
39
+ > ボタンの数が多くなる予定なのでできれば、for文を使って効率よくコードを書きたいと思っています。
40
+
39
41
  他の解決策:
40
- 一連のウィジェット/オブジェクトをひとつのクラスに纏める
42
+ 一連のウィジェット/オブジェクトをひとつのクラスに纏めると、
41
43
  インスタンス変数で関連付けられたウィジェットにアクセスできます。
42
44
 
43
45
  ```python