(self, figure=None, master=None)
| 192 | manager_class = _api.classproperty(lambda cls: FigureManagerTk) |
| 193 | |
| 194 | def __init__(self, figure=None, master=None): |
| 195 | super().__init__(figure) |
| 196 | self._idle_draw_id = None |
| 197 | self._event_loop_id = None |
| 198 | w, h = self.get_width_height(physical=True) |
| 199 | self._tkcanvas = tk.Canvas( |
| 200 | master=master, background="white", |
| 201 | width=w, height=h, borderwidth=0, highlightthickness=0) |
| 202 | self._tkphoto = tk.PhotoImage( |
| 203 | master=self._tkcanvas, width=w, height=h) |
| 204 | self._tkcanvas_image_region = self._tkcanvas.create_image( |
| 205 | w//2, h//2, image=self._tkphoto) |
| 206 | self._tkcanvas.bind("<Configure>", self.resize) |
| 207 | self._tkcanvas.bind("<Map>", self._update_device_pixel_ratio) |
| 208 | self._tkcanvas.bind("<Key>", self.key_press) |
| 209 | self._tkcanvas.bind("<Motion>", self.motion_notify_event) |
| 210 | self._tkcanvas.bind("<Enter>", self.enter_notify_event) |
| 211 | self._tkcanvas.bind("<Leave>", self.leave_notify_event) |
| 212 | self._tkcanvas.bind("<KeyRelease>", self.key_release) |
| 213 | for name in ["<Button-1>", "<Button-2>", "<Button-3>"]: |
| 214 | self._tkcanvas.bind(name, self.button_press_event) |
| 215 | for name in [ |
| 216 | "<Double-Button-1>", "<Double-Button-2>", "<Double-Button-3>"]: |
| 217 | self._tkcanvas.bind(name, self.button_dblclick_event) |
| 218 | for name in [ |
| 219 | "<ButtonRelease-1>", "<ButtonRelease-2>", "<ButtonRelease-3>"]: |
| 220 | self._tkcanvas.bind(name, self.button_release_event) |
| 221 | |
| 222 | # Mouse wheel on Linux generates button 4/5 events |
| 223 | for name in "<Button-4>", "<Button-5>": |
| 224 | self._tkcanvas.bind(name, self.scroll_event) |
| 225 | # Mouse wheel for windows goes to the window with the focus. |
| 226 | # Since the canvas won't usually have the focus, bind the |
| 227 | # event to the window containing the canvas instead. |
| 228 | # See https://wiki.tcl-lang.org/3893 (mousewheel) for details |
| 229 | root = self._tkcanvas.winfo_toplevel() |
| 230 | |
| 231 | # Prevent long-lived references via tkinter callback structure GH-24820 |
| 232 | weakself = weakref.ref(self) |
| 233 | weakroot = weakref.ref(root) |
| 234 | |
| 235 | def scroll_event_windows(event): |
| 236 | self = weakself() |
| 237 | if self is None: |
| 238 | root = weakroot() |
| 239 | if root is not None: |
| 240 | root.unbind("<MouseWheel>", scroll_event_windows_id) |
| 241 | return |
| 242 | return self.scroll_event_windows(event) |
| 243 | scroll_event_windows_id = root.bind("<MouseWheel>", scroll_event_windows, "+") |
| 244 | |
| 245 | # Can't get destroy events by binding to _tkcanvas. Therefore, bind |
| 246 | # to the window and filter. |
| 247 | def filter_destroy(event): |
| 248 | self = weakself() |
| 249 | if self is None: |
| 250 | root = weakroot() |
| 251 | if root is not None: |
nothing calls this directly
no test coverage detected