diff --git a/lib/matplotlib/backends/_backend_tk.py b/lib/matplotlib/backends/_backend_tk.py index df06440a9826..d7c2f59be6b9 100644 --- a/lib/matplotlib/backends/_backend_tk.py +++ b/lib/matplotlib/backends/_backend_tk.py @@ -176,8 +176,7 @@ def __init__(self, figure=None, master=None): self._tkcanvas_image_region = self._tkcanvas.create_image( w//2, h//2, image=self._tkphoto) self._tkcanvas.bind("", self.resize) - if sys.platform == 'win32': - self._tkcanvas.bind("", self._update_device_pixel_ratio) + self._tkcanvas.bind("", self._update_device_pixel_ratio) self._tkcanvas.bind("", self.key_press) self._tkcanvas.bind("", self.motion_notify_event) self._tkcanvas.bind("", self.enter_notify_event) @@ -234,11 +233,15 @@ def filter_destroy(event): self._rubberband_rect_white = None def _update_device_pixel_ratio(self, event=None): - # Tk gives scaling with respect to 72 DPI, but Windows screens are - # scaled vs 96 dpi, and pixel ratio settings are given in whole - # percentages, so round to 2 digits. - ratio = round(self._tkcanvas.tk.call('tk', 'scaling') / (96 / 72), 2) - if self._set_device_pixel_ratio(ratio): + ratio = None + if sys.platform == 'win32': + # Tk gives scaling with respect to 72 DPI, but Windows screens are + # scaled vs 96 dpi, and pixel ratio settings are given in whole + # percentages, so round to 2 digits. + ratio = round(self._tkcanvas.tk.call('tk', 'scaling') / (96 / 72), 2) + elif sys.platform == "linux": + ratio = self._tkcanvas.winfo_fpixels('1i') / 96 + if ratio is not None and self._set_device_pixel_ratio(ratio): # The easiest way to resize the canvas is to resize the canvas # widget itself, since we implement all the logic for resizing the # canvas backing store on that event.