Я пытался перенести некоторые сценарии за графический интерфейс (используя 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()