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

回答編集履歴

1

trace版 追記

2020/06/11 13:09

投稿

hope_mucci
hope_mucci

スコア4447

answer CHANGED
@@ -78,4 +78,41 @@
78
78
  if __name__ == "__main__":
79
79
  app = SampleApp()
80
80
  app.mainloop()
81
+ ```
82
+
83
+ ### 追記
84
+ コメントの内容を受けてtrace版を作ってみました。
85
+ 新しいコンポーネントクラスは作らなくてもよくなります。
86
+ ただしbindのような柔軟なイベント処理ができない(trace発生元のStringVarはわかるがそこからバインドされているコンポーネントをたどるのは難しい)ので多数のコンポーネントが相手になるとソースがこんがらかりそうです。監視先が1つ2つだったら楽そうです。
87
+ ```python
88
+ import tkinter as tk
89
+
90
+ class SampleApp(tk.Tk):
91
+
92
+ def __init__(self, *args, **kwargs):
93
+ tk.Tk.__init__(self, *args, **kwargs)
94
+ # StringVarとEntryはコールバック内で参照するためインスタンス変数にする
95
+ self.sv1 = tk.StringVar()
96
+ self.sv1.trace("w",self.var_changed) # sv1に書き込みされるとvar_chagedがコールバック
97
+
98
+ self.e1 = tk.Entry(self, textvariable = self.sv1) # textvariableとsv1をバインド
99
+ e2 = tk.Entry(self)
100
+
101
+ e2.insert(0,"2")
102
+
103
+ self.e1.pack()
104
+ e2.pack()
105
+ # argsにはtrace発生元のVarの_nameが入っている
106
+ # StringVarはargsから探せるが発生元のエレメントを探すのは大変
107
+ # なのでイベント発生元はハードコーディング
108
+ def var_changed(self, *args):
109
+ s = self.sv1.get()
110
+ if len(s) == 0:
111
+ return
112
+ if s[-1] == "\n":
113
+ self.e1.tk_focusNext().focus_set()
114
+
115
+ if __name__ == "__main__":
116
+ app = SampleApp()
117
+ app.mainloop()
81
118
  ```