質問編集履歴

4

細かい整形

2018/11/11 05:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -50,13 +50,15 @@
50
50
 
51
51
  - tkinter.TkVersion ... 8.6
52
52
 
53
+ - tkinter.TclVersion ... 8.6
54
+
53
55
 
54
56
 
55
57
  ### 追記
56
58
 
57
59
 
58
60
 
59
- 上のコードでは指摘された通り`bind_id`と`bind_id2`が同じになっていました。なので何のErrorも吐ずに二つ目の`unbind()`が通てしまったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
61
+ 上のコードでは指摘された通り`bind_id`と`bind_id2`が同じになっていました。なのでErrorが怒らなかったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
60
62
 
61
63
 
62
64
 
@@ -98,7 +100,7 @@
98
100
 
99
101
 
100
102
 
101
- A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。
103
+ A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまうからです。
102
104
 
103
105
 
104
106
 
@@ -106,7 +108,7 @@
106
108
 
107
109
 
108
110
 
109
- 上の問題に関してはstackoverflowにあった[この記事](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
111
+ 上の問題に関してはstackoverflowにあった[この投稿](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
110
112
 
111
113
 
112
114
 

3

ニつ目の問題に対する対策を追記

2018/11/11 05:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -99,3 +99,81 @@
99
99
 
100
100
 
101
101
  A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。
102
+
103
+
104
+
105
+ ### 追記2
106
+
107
+
108
+
109
+ 上の問題に関してはstackoverflowにあった[この記事](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
110
+
111
+
112
+
113
+ ```python
114
+
115
+ from tkinter import *
116
+
117
+
118
+
119
+
120
+
121
+ def new_unbind(self, sequence, funcid=None):
122
+
123
+ """Unbind for this widget for event SEQUENCE the
124
+
125
+ function identified with FUNCID."""
126
+
127
+ if not funcid:
128
+
129
+ self.tk.call('bind', self._w, sequence, '')
130
+
131
+ return
132
+
133
+ func_callbacks = self.tk.call('bind', self._w, sequence, None).split('\n')
134
+
135
+ new_callbacks = [l for l in func_callbacks if l[6:6 + len(funcid)] != funcid]
136
+
137
+ self.tk.call('bind', self._w, sequence, '\n'.join(new_callbacks))
138
+
139
+ self.deletecommand(funcid)
140
+
141
+
142
+
143
+
144
+
145
+ old_unbind = Misc.unbind
146
+
147
+ Misc.unbind = new_unbind
148
+
149
+
150
+
151
+
152
+
153
+ root = Tk()
154
+
155
+ button = Button(root, text='Push Me', font=('', 40))
156
+
157
+ button.pack()
158
+
159
+
160
+
161
+ bind_id = button.bind('<Button-1>', lambda event: print('1st callback'), '+')
162
+
163
+ print(bind_id)
164
+
165
+ bind_id2 = button.bind('<Button-1>', lambda event: print('2nd callback'), '+')
166
+
167
+ print(bind_id2)
168
+
169
+
170
+
171
+ # button.unbind('<Button-1>', bind_id) # A
172
+
173
+ button.unbind('<Button-1>', bind_id2) # B
174
+
175
+
176
+
177
+ root.mainloop()
178
+
179
+ ```

2

別の問題を追記

2018/11/10 15:13

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,53 @@
49
49
  - Python 3.6.2
50
50
 
51
51
  - tkinter.TkVersion ... 8.6
52
+
53
+
54
+
55
+ ### 追記
56
+
57
+
58
+
59
+ 上のコードでは指摘された通り、`bind_id`と`bind_id2`が同じになっていました。なので何のErrorも吐かずに二つ目の`unbind()`が通ってしまったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
60
+
61
+
62
+
63
+ ```python
64
+
65
+ from tkinter import *
66
+
67
+
68
+
69
+
70
+
71
+ root = Tk()
72
+
73
+ button = Button(root, text='Push Me', font=('', 40))
74
+
75
+ button.pack()
76
+
77
+
78
+
79
+ bind_id = button.bind('<Button-1>', lambda event: print('1st callback'), '+')
80
+
81
+ print(bind_id)
82
+
83
+ bind_id2 = button.bind('<Button-1>', lambda event: print('2nd callback'), '+')
84
+
85
+ print(bind_id2)
86
+
87
+
88
+
89
+ button.unbind('<Button-1>', bind_id) # A
90
+
91
+ # button.unbind('<Button-1>', bind_id2) # B
92
+
93
+
94
+
95
+ root.mainloop()
96
+
97
+ ```
98
+
99
+
100
+
101
+ A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。

1

実行環境の情報を載せ忘れたので追記

2018/11/10 14:05

投稿

gottadiveintopy
gottadiveintopy

スコア736

test CHANGED
File without changes
test CHANGED
@@ -37,3 +37,15 @@
37
37
 
38
38
 
39
39
  出てきたButtonを押しても何も出力されないので二つ目の`bind()`も解除されているように思えます。
40
+
41
+
42
+
43
+ ### 環境
44
+
45
+
46
+
47
+ - OS ... LinuxMint18.2 MATE Edition (Ubuntu16.04LTS派生)
48
+
49
+ - Python 3.6.2
50
+
51
+ - tkinter.TkVersion ... 8.6