Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 17b6c30

Browse files
authored
Merge pull request #10446 from fariza/copy-tool
implementation of the copy canvas tool
2 parents 0984694 + 3866f29 commit 17b6c30

File tree

7 files changed

+45
-0
lines changed

7 files changed

+45
-0
lines changed

lib/matplotlib/backend_tools.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,17 @@ def _get_help_html(self):
10631063
"<tbody>".join(rows[1:]) + "</tbody></table>")
10641064

10651065

1066+
class ToolCopyToClipboardBase(ToolBase):
1067+
"""Tool to copy the figure to the clipboard"""
1068+
1069+
description = 'Copy the canvas figure to clipboard'
1070+
default_keymap = rcParams['keymap.copy']
1071+
1072+
def trigger(self, *args, **kwargs):
1073+
message = "Copy tool is not available"
1074+
self.toolmanager.message_event(message, self)
1075+
1076+
10661077
default_tools = {'home': ToolHome, 'back': ToolBack, 'forward': ToolForward,
10671078
'zoom': ToolZoom, 'pan': ToolPan,
10681079
'subplots': 'ToolConfigureSubplots',
@@ -1081,6 +1092,7 @@ def _get_help_html(self):
10811092
'cursor': 'ToolSetCursor',
10821093
'rubberband': 'ToolRubberband',
10831094
'help': 'ToolHelp',
1095+
'copy': 'ToolCopyToClipboard',
10841096
}
10851097
"""Default tools"""
10861098

lib/matplotlib/backends/_backend_tk.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,7 @@ def trigger(self, *args):
976976
backend_tools.ToolSetCursor = SetCursorTk
977977
backend_tools.ToolRubberband = RubberbandTk
978978
backend_tools.ToolHelp = HelpTk
979+
backend_tools.ToolCopyToClipboard = backend_tools.ToolCopyToClipboardBase
979980
Toolbar = ToolbarTk
980981

981982

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,15 @@ def trigger(self, *args):
923923
self._show_shortcuts_dialog()
924924

925925

926+
class ToolCopyToClipboardGTK3(backend_tools.ToolCopyToClipboardBase):
927+
def trigger(self, *args, **kwargs):
928+
clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
929+
window = self.canvas.get_window()
930+
x, y, width, height = window.get_geometry()
931+
pb = Gdk.pixbuf_get_from_window(window, x, y, width, height)
932+
clipboard.set_image(pb)
933+
934+
926935
# Define the file to use as the GTk icon
927936
if sys.platform == 'win32':
928937
icon_filename = 'matplotlib.png'
@@ -955,6 +964,7 @@ def error_msg_gtk(msg, parent=None):
955964
backend_tools.ToolSetCursor = SetCursorGTK3
956965
backend_tools.ToolRubberband = RubberbandGTK3
957966
backend_tools.ToolHelp = HelpGTK3
967+
backend_tools.ToolCopyToClipboard = ToolCopyToClipboardGTK3
958968

959969
Toolbar = ToolbarGTK3
960970

lib/matplotlib/backends/backend_qt5.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,11 +1066,18 @@ def trigger(self, *args):
10661066
QtWidgets.QMessageBox.information(None, "Help", self._get_help_html())
10671067

10681068

1069+
class ToolCopyToClipboardQT(backend_tools.ToolCopyToClipboardBase):
1070+
def trigger(self, *args, **kwargs):
1071+
pixmap = self.canvas.grab()
1072+
qApp.clipboard().setPixmap(pixmap)
1073+
1074+
10691075
backend_tools.ToolSaveFigure = SaveFigureQt
10701076
backend_tools.ToolConfigureSubplots = ConfigureSubplotsQt
10711077
backend_tools.ToolSetCursor = SetCursorQt
10721078
backend_tools.ToolRubberband = RubberbandQt
10731079
backend_tools.ToolHelp = HelpQt
1080+
backend_tools.ToolCopyToClipboard = ToolCopyToClipboardQT
10741081

10751082

10761083
@cbook.deprecated("3.0")

lib/matplotlib/backends/backend_wx.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,9 +1826,22 @@ def remove_rubberband(self, dc=None):
18261826
self._rect = None
18271827

18281828

1829+
class ToolCopyToClipboardWx(backend_tools.ToolCopyToClipboardBase):
1830+
def trigger(self, *args, **kwargs):
1831+
if not self.canvas._isDrawn:
1832+
self.canvas.draw()
1833+
if not self.canvas.bitmap.IsOk() or not wx.TheClipboard.Open():
1834+
return
1835+
try:
1836+
wx.TheClipboard.SetData(wx.BitmapDataObject(self.canvas.bitmap))
1837+
finally:
1838+
wx.TheClipboard.Close()
1839+
1840+
18291841
backend_tools.ToolSaveFigure = SaveFigureWx
18301842
backend_tools.ToolSetCursor = SetCursorWx
18311843
backend_tools.ToolRubberband = RubberbandWx
1844+
backend_tools.ToolCopyToClipboard = ToolCopyToClipboardWx
18321845

18331846

18341847
# < Additions for printing support: Matt Newville

lib/matplotlib/rcsetup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,7 @@ def _validate_linestyle(ls):
14221422
'keymap.xscale': [['k', 'L'], validate_stringlist],
14231423
'keymap.all_axes': [['a'], validate_stringlist],
14241424
'keymap.help': [['f1'], validate_stringlist],
1425+
'keymap.copy': [['ctrl+c', 'cmd+c'], validate_stringlist],
14251426

14261427
# sample data
14271428
'examples.directory': ['', validate_string],

matplotlibrc.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,7 @@ backend : $TEMPLATE_BACKEND
591591
#keymap.yscale : l ## toggle scaling of y-axes ('log'/'linear')
592592
#keymap.xscale : k, L ## toggle scaling of x-axes ('log'/'linear')
593593
#keymap.all_axes : a ## enable all axes
594+
#keymap.copy : ctrl+c, cmd+c ## Copy figure to clipboard
594595

595596
## Control location of examples data files
596597
#examples.directory : ## directory to look in for custom installation

0 commit comments

Comments
 (0)