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

質問編集履歴

4

細かい整形

2018/11/11 05:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

title CHANGED
File without changes
body CHANGED
@@ -24,10 +24,11 @@
24
24
  - OS ... LinuxMint18.2 MATE Edition (Ubuntu16.04LTS派生)
25
25
  - Python 3.6.2
26
26
  - tkinter.TkVersion ... 8.6
27
+ - tkinter.TclVersion ... 8.6
27
28
 
28
29
  ### 追記
29
30
 
30
- 上のコードでは指摘された通り`bind_id`と`bind_id2`が同じになっていました。なので何のErrorも吐かずに二つ目の`unbind()`てしまったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
31
+ 上のコードでは指摘された通り`bind_id`と`bind_id2`が同じになっていました。なのでErrorが怒らなかったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
31
32
 
32
33
  ```python
33
34
  from tkinter import *
@@ -48,11 +49,11 @@
48
49
  root.mainloop()
49
50
  ```
50
51
 
51
- A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。
52
+ A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまうからです。
52
53
 
53
54
  ### 追記2
54
55
 
55
- 上の問題に関してはstackoverflowにあった[この記事](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
56
+ 上の問題に関してはstackoverflowにあった[この投稿](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
56
57
 
57
58
  ```python
58
59
  from tkinter import *

3

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

2018/11/11 05:51

投稿

gottadiveintopy
gottadiveintopy

スコア736

title CHANGED
File without changes
body CHANGED
@@ -48,4 +48,43 @@
48
48
  root.mainloop()
49
49
  ```
50
50
 
51
- A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。
51
+ A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。
52
+
53
+ ### 追記2
54
+
55
+ 上の問題に関してはstackoverflowにあった[この記事](https://stackoverflow.com/questions/6433369/deleting-and-changing-a-tkinter-event-binding)を参考に`unbind()`を修正した所、期待通りの動作をしてくれました。
56
+
57
+ ```python
58
+ from tkinter import *
59
+
60
+
61
+ def new_unbind(self, sequence, funcid=None):
62
+ """Unbind for this widget for event SEQUENCE the
63
+ function identified with FUNCID."""
64
+ if not funcid:
65
+ self.tk.call('bind', self._w, sequence, '')
66
+ return
67
+ func_callbacks = self.tk.call('bind', self._w, sequence, None).split('\n')
68
+ new_callbacks = [l for l in func_callbacks if l[6:6 + len(funcid)] != funcid]
69
+ self.tk.call('bind', self._w, sequence, '\n'.join(new_callbacks))
70
+ self.deletecommand(funcid)
71
+
72
+
73
+ old_unbind = Misc.unbind
74
+ Misc.unbind = new_unbind
75
+
76
+
77
+ root = Tk()
78
+ button = Button(root, text='Push Me', font=('', 40))
79
+ button.pack()
80
+
81
+ bind_id = button.bind('<Button-1>', lambda event: print('1st callback'), '+')
82
+ print(bind_id)
83
+ bind_id2 = button.bind('<Button-1>', lambda event: print('2nd callback'), '+')
84
+ print(bind_id2)
85
+
86
+ # button.unbind('<Button-1>', bind_id) # A
87
+ button.unbind('<Button-1>', bind_id2) # B
88
+
89
+ root.mainloop()
90
+ ```

2

別の問題を追記

2018/11/10 15:13

投稿

gottadiveintopy
gottadiveintopy

スコア736

title CHANGED
File without changes
body CHANGED
@@ -23,4 +23,29 @@
23
23
 
24
24
  - OS ... LinuxMint18.2 MATE Edition (Ubuntu16.04LTS派生)
25
25
  - Python 3.6.2
26
- - tkinter.TkVersion ... 8.6
26
+ - tkinter.TkVersion ... 8.6
27
+
28
+ ### 追記
29
+
30
+ 上のコードでは指摘された通り、`bind_id`と`bind_id2`が同じになっていました。なので何のErrorも吐かずに二つ目の`unbind()`が通ってしまったものと思われます。ただそれでもはやり`unbind()`が正しく機能していないように思えます。理由は以下のコードで
31
+
32
+ ```python
33
+ from tkinter import *
34
+
35
+
36
+ root = Tk()
37
+ button = Button(root, text='Push Me', font=('', 40))
38
+ button.pack()
39
+
40
+ bind_id = button.bind('<Button-1>', lambda event: print('1st callback'), '+')
41
+ print(bind_id)
42
+ bind_id2 = button.bind('<Button-1>', lambda event: print('2nd callback'), '+')
43
+ print(bind_id2)
44
+
45
+ button.unbind('<Button-1>', bind_id) # A
46
+ # button.unbind('<Button-1>', bind_id2) # B
47
+
48
+ root.mainloop()
49
+ ```
50
+
51
+ A行とB行のどちらか一つを有効にしただけで、callback関数は両方共呼ばれなくなってしまいます。

1

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

2018/11/10 14:05

投稿

gottadiveintopy
gottadiveintopy

スコア736

title CHANGED
File without changes
body CHANGED
@@ -17,4 +17,10 @@
17
17
 
18
18
  ![screenshot](4cb741c82bd52bb26e3b9ee3ef474b6d.png)
19
19
 
20
- 出てきたButtonを押しても何も出力されないので二つ目の`bind()`も解除されているように思えます。
20
+ 出てきたButtonを押しても何も出力されないので二つ目の`bind()`も解除されているように思えます。
21
+
22
+ ### 環境
23
+
24
+ - OS ... LinuxMint18.2 MATE Edition (Ubuntu16.04LTS派生)
25
+ - Python 3.6.2
26
+ - tkinter.TkVersion ... 8.6