@@ -167,7 +167,7 @@ def __init__(self, figure=None, master=None, resize_callback=None):
167
167
super ().__init__ (figure )
168
168
self ._idle_draw_id = None
169
169
self ._event_loop_id = None
170
- w , h = self .figure . bbox . size . astype ( int )
170
+ w , h = self .get_width_height ( physical = True )
171
171
self ._tkcanvas = tk .Canvas (
172
172
master = master , background = "white" ,
173
173
width = w , height = h , borderwidth = 0 , highlightthickness = 0 )
@@ -176,6 +176,7 @@ def __init__(self, figure=None, master=None, resize_callback=None):
176
176
self ._tkcanvas .create_image (w // 2 , h // 2 , image = self ._tkphoto )
177
177
self ._resize_callback = resize_callback
178
178
self ._tkcanvas .bind ("<Configure>" , self .resize )
179
+ self ._tkcanvas .bind ("<Map>" , self ._update_device_pixel_ratio )
179
180
self ._tkcanvas .bind ("<Key>" , self .key_press )
180
181
self ._tkcanvas .bind ("<Motion>" , self .motion_notify_event )
181
182
self ._tkcanvas .bind ("<Enter>" , self .enter_notify_event )
@@ -210,6 +211,18 @@ def filter_destroy(event):
210
211
self ._master = master
211
212
self ._tkcanvas .focus_set ()
212
213
214
+ def _update_device_pixel_ratio (self , event = None ):
215
+ # Tk gives scaling with respect to 72 DPI, but most (all?) screens are
216
+ # scaled vs 96 dpi, and pixel ratio settings are given in whole
217
+ # percentages, so round to 2 digits.
218
+ ratio = round (self ._master .call ('tk' , 'scaling' ) / (96 / 72 ), 2 )
219
+ if self ._set_device_pixel_ratio (ratio ):
220
+ # The easiest way to resize the canvas is to resize the canvas
221
+ # widget itself, since we implement all the logic for resizing the
222
+ # canvas backing store on that event.
223
+ w , h = self .get_width_height (physical = True )
224
+ self ._tkcanvas .configure (width = w , height = h )
225
+
213
226
def resize (self , event ):
214
227
width , height = event .width , event .height
215
228
if self ._resize_callback is not None :
@@ -845,6 +858,7 @@ def new_figure_manager_given_figure(cls, num, figure):
845
858
with _restore_foreground_window_at_end ():
846
859
if cbook ._get_running_interactive_framework () is None :
847
860
cbook ._setup_new_guiapp ()
861
+ _c_internal_utils .Win32_SetDpiAwareness ()
848
862
window = tk .Tk (className = "matplotlib" )
849
863
window .withdraw ()
850
864
0 commit comments