функциональность масштабирования matplotlib внутри холста tkinter

Я пытался перенести некоторые сценарии за графический интерфейс (используя Tkinter) и до сих пор добился того, что любые открытые данные отображаются на холсте Tkinter (используя matplotlib для его рисования).

Единственная проблема, с которой я столкнулся, заключается в том, что стандартное масштабирование/прокрутка, которые есть в matplotlib (используя левую кнопку мыши для «перемещения» графика и правую кнопку мыши для «масштабирования»), недоступны на холсте, в основном функциональность «4-конечный крест» в окне графика matplotlib.

Я думаю, что это потребует создания моих собственных обработчиков, но я предполагаю, что должен быть способ использовать обработчики по умолчанию для matplotlib? Я также рассмотрел параметры «прокрутки» холста, как указано в этот вопрос, но кажется, что они только изменяют размер области графика вместо увеличения/уменьшения масштаба данных, также я не хочу добавлять какие-либо дополнительные кнопки только для управления площадь участка.

Самый минимальный код, который у меня есть в настоящее время:

#! /usr/bin/env python
from Tkinter import *
import matplotlib.pyplot as plt
import matplotlib.backends.backend_tkagg as tkagg
import tkFileDialog

class App():
    def __init__(self,master):
        # VARIABLES
        self.inputFile = ""
        self.fig = plt.Figure()
        self.canvas = tkagg.FigureCanvasTkAgg(self.fig, master = master)
        self.canvas.get_tk_widget().pack()
        self.canvas.draw()

        # FRAME
        frame = Frame(master)
        master.title("MassyTools 0.1.1 (Alpha)")

        # VARIABLE ENTRIES

        # BUTTONS

        # MENU
        menu = Menu(root)
        root.config(menu = menu)

        filemenu = Menu(menu)
        menu.add_cascade(label="File", menu=filemenu)
        filemenu.add_command(label="Open Input File", command = self.openFile)
        calibmenu = Menu(menu)
        menu.add_cascade(label="Calibrate",menu=calibmenu)
        calibmenu.add_command(label="Open Calibration File", command = self.openCalibrationFile)
        calibmenu.add_command(label="Calibrate", command = self.calibrateData)  

    def openFile(self):
        file_path = tkFileDialog.askopenfilename()
        setattr(self,'inputFile',file_path)
        data = self.readData()
        self.plotData(data)

    def openCalibrationFile(self):
        print "Place holder for selection of the calibration file"

    def calibrateData(self):
        print "Place holder for actual calibration"

    def readData(self):
        x_array = []
        y_array = []
        with open(self.inputFile,'r') as fr:
            for line in fr:
                line = line.rstrip('\n')
                values = line.split()
                x_array.append(float(values[0]))
                y_array.append(float(values[1]))
        return zip(x_array,y_array)

    def plotData(self,data):
        x_array = []
        y_array = []
        for i in data:
            x_array.append(i[0])
            y_array.append(i[1])
        self.fig.clear()
        self.axes = self.fig.add_subplot(111)
        self.line, = self.axes.plot(x_array,y_array)
        self.canvas.draw()

# Stuff that is not being used now but can be useful                        
    """def openFile(self,number):
        name = tkFileDialog.askopenfilename()
        ops = {
            1: 'deglycoData',
            2: 'peptideFile',
            3: 'mzML'
        }
        setattr(self,ops[number],name)
    """
# End of 'stuff'

root = Tk()
app = App(root)
root.mainloop()

person Bas Jansen    schedule 31.03.2014    source источник


Ответы (1)


Таким образом, вы можете прикрепить объект NavigationToolbar2TkAgg к своему холсту, который предоставит вам все обычные методы и инструменты matplotlib.

import matplotlib.backends.backend_tkagg as tkagg

# canvas is your canvas, and root is your parent (Frame, TopLevel, Tk instance etc.)
tkagg.NavigationToolbar2TkAgg(canvas, root)

Хороший пример его использования можно найти здесь: Обновление координат графика в matplotlib.

И пример того, как добавить к нему пользовательские методы, можно найти здесь (см. class NavSelectToolbar(NavigationToolbar2TkAgg)).

person ebarr    schedule 31.03.2014
comment
Ну, это было проще, чем я ожидал. Однако я высоко ценю вторую часть вашего вопроса, поскольку она должна помочь мне получить функциональность без добавления видимых кнопок (надеюсь). - person Bas Jansen; 31.03.2014
comment
Помните, что подкласс NavigationToolbar2TkAgg имеет несколько скрытых ловушек. Ничего особенного, но если вы столкнетесь с каким-либо забавным поведением, вам стоит взглянуть на исходный код. - person ebarr; 01.04.2014