Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.9/dist-packages/matplotlib/_pylab_helpers.py: 44%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

66 statements  

1""" 

2Manage figures for the pyplot interface. 

3""" 

4 

5import atexit 

6from collections import OrderedDict 

7 

8 

9class Gcf: 

10 """ 

11 Singleton to maintain the relation between figures and their managers, and 

12 keep track of and "active" figure and manager. 

13 

14 The canvas of a figure created through pyplot is associated with a figure 

15 manager, which handles the interaction between the figure and the backend. 

16 pyplot keeps track of figure managers using an identifier, the "figure 

17 number" or "manager number" (which can actually be any hashable value); 

18 this number is available as the :attr:`number` attribute of the manager. 

19 

20 This class is never instantiated; it consists of an `OrderedDict` mapping 

21 figure/manager numbers to managers, and a set of class methods that 

22 manipulate this `OrderedDict`. 

23 

24 Attributes 

25 ---------- 

26 figs : OrderedDict 

27 `OrderedDict` mapping numbers to managers; the active manager is at the 

28 end. 

29 """ 

30 

31 figs = OrderedDict() 

32 

33 @classmethod 

34 def get_fig_manager(cls, num): 

35 """ 

36 If manager number *num* exists, make it the active one and return it; 

37 otherwise return *None*. 

38 """ 

39 manager = cls.figs.get(num, None) 

40 if manager is not None: 

41 cls.set_active(manager) 

42 return manager 

43 

44 @classmethod 

45 def destroy(cls, num): 

46 """ 

47 Destroy manager *num* -- either a manager instance or a manager number. 

48 

49 In the interactive backends, this is bound to the window "destroy" and 

50 "delete" events. 

51 

52 It is recommended to pass a manager instance, to avoid confusion when 

53 two managers share the same number. 

54 """ 

55 if all(hasattr(num, attr) for attr in ["num", "destroy"]): 

56 manager = num 

57 if cls.figs.get(manager.num) is manager: 

58 cls.figs.pop(manager.num) 

59 else: 

60 try: 

61 manager = cls.figs.pop(num) 

62 except KeyError: 

63 return 

64 if hasattr(manager, "_cidgcf"): 

65 manager.canvas.mpl_disconnect(manager._cidgcf) 

66 manager.destroy() 

67 

68 @classmethod 

69 def destroy_fig(cls, fig): 

70 """Destroy figure *fig*.""" 

71 num = next((manager.num for manager in cls.figs.values() 

72 if manager.canvas.figure == fig), None) 

73 if num is not None: 

74 cls.destroy(num) 

75 

76 @classmethod 

77 def destroy_all(cls): 

78 """Destroy all figures.""" 

79 for manager in list(cls.figs.values()): 

80 manager.canvas.mpl_disconnect(manager._cidgcf) 

81 manager.destroy() 

82 cls.figs.clear() 

83 

84 @classmethod 

85 def has_fignum(cls, num): 

86 """Return whether figure number *num* exists.""" 

87 return num in cls.figs 

88 

89 @classmethod 

90 def get_all_fig_managers(cls): 

91 """Return a list of figure managers.""" 

92 return list(cls.figs.values()) 

93 

94 @classmethod 

95 def get_num_fig_managers(cls): 

96 """Return the number of figures being managed.""" 

97 return len(cls.figs) 

98 

99 @classmethod 

100 def get_active(cls): 

101 """Return the active manager, or *None* if there is no manager.""" 

102 return next(reversed(cls.figs.values())) if cls.figs else None 

103 

104 @classmethod 

105 def _set_new_active_manager(cls, manager): 

106 """Adopt *manager* into pyplot and make it the active manager.""" 

107 if not hasattr(manager, "_cidgcf"): 

108 manager._cidgcf = manager.canvas.mpl_connect( 

109 "button_press_event", lambda event: cls.set_active(manager)) 

110 fig = manager.canvas.figure 

111 fig.number = manager.num 

112 label = fig.get_label() 

113 if label: 

114 manager.set_window_title(label) 

115 cls.set_active(manager) 

116 

117 @classmethod 

118 def set_active(cls, manager): 

119 """Make *manager* the active manager.""" 

120 cls.figs[manager.num] = manager 

121 cls.figs.move_to_end(manager.num) 

122 

123 @classmethod 

124 def draw_all(cls, force=False): 

125 """ 

126 Redraw all stale managed figures, or, if *force* is True, all managed 

127 figures. 

128 """ 

129 for manager in cls.get_all_fig_managers(): 

130 if force or manager.canvas.figure.stale: 

131 manager.canvas.draw_idle() 

132 

133 

134atexit.register(Gcf.destroy_all)