Python 3.x pyqt5 Добавить функцию копирования в буфер обмена в matplotlib с использованием бэкэнда QT5 - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь добавить функцию копирования в буфер обмена в мой виджет PyQt5.В backend_qt5 я вижу класс NavigationToolbar2QT, а также класс ToolCopyToClipboardQT.Мой вопрос заключается в том, как реализовать этот класс в NavigationToolbar с помощью кнопки и ярлыка «STRG + C»?

Я не уверен, где я нашел пример исходного кода, я думаю, что он здесь на stackoverflow.Я также нашел на сайте matplotlibs пример использования менеджера инструментов для изменения панели навигации, но я не понимаю, как его использовать.Я использую Python3.7 и QT5

Я надеюсь, что кто-то может мне помочь.

Заранее спасибо,
Томас

import sys
from PyQt5 import QtWidgets

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar

# How to implement the following ToolCopyToClipboardQT?
#from matplotlib.backends.backend_qt5 import ToolCopyToClipboardQT

#matplotlib.rcParams['toolbar'] = 'toolmanager'

# i've found addcopyfighandler, but this seems only to work under windows
#import addcopyfighandler


class PlotFigure(QtWidgets.QDialog):
    def __init__(self, title, data, parent=None):

        super(PlotFigure, self).__init__(parent)

        # a figure instance to plot on
        self.figure = Figure()

        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)
        #self.figure.canvas.manager.toolmanager.add_tool('Copy', ToolCopyToClipboardQT )
        # this is the Navigation widget
        # it takes the Canvas widget and a parent
        self.toolbar = NavigationToolbar(self.canvas, self)

        # Just some button connected to `plot` method
        if __name__ == '__main__':

            self.button = QtWidgets.QPushButton('Plot')
            self.button.clicked.connect(self.plot)

        self.copybutton = QtWidgets.QPushButton('Copy')
        self.copybutton.clicked.connect(self.copy)

        # set the layout
        layout = QtWidgets.QVBoxLayout()

        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)

        if __name__ == '__main__': 
            layout.addWidget(self.button)

        layout.addWidget(self.copybutton)

        self.setLayout(layout)

        self.title = title

        self.data = data

        # Hmm is this the correct way?
        self.qApp = QtWidgets.QApplication


    def savefig(self, filename, **kwargs):
        self.figure.savefig(filename, **kwargs)     


    # To get the copy to clipboard functionality I generate a button on the widget
    # Actually, I do not want to add it to my widget, but in the Navigator Toolbar
    def copy(self):
        pixmap = self.canvas.grab()
        self.qApp.clipboard().setPixmap(pixmap)

    def plot(self):
        ''' plot the stuff '''
        self.data['df'].plot(ax=self.figure.gca(), x = self.data['x'],  title=self.title)

    # refresh canvas
    self.canvas.draw()



if __name__ == '__main__':

    from random import randrange
    import pandas as pd

    numdata = 100
    start = 35

    # Some demo data
    pltdata = {}
    pltdata['x']='Time'
    pltdata['df'] = pd.DataFrame(dict(
        Time=[i * 0.00710324483775811209 for i in range(start, numdata + start)],
        Fa=[randrange(-1000, 1000) for _ in range(numdata)],
        Fb=[randrange(-500, 500) for _ in range(numdata)],
        Fx=[randrange(-100, 100) for _ in range(numdata)],
        Fy=[randrange(-50, 50) for _ in range(numdata)],
        Fz=[randrange(-10, 10) for _ in range(numdata)],
    ))


    app = QtWidgets.QApplication(sys.argv)

    main = PlotFigure("Demo plot", pltdata)
    main.show()

    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...