<reponame>Storvild/wheellog_graph<filename>wheellog_graph.py
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
import os
import matplotlib
import matplotlib.pyplot
from tk_zoom import ZoomPan
from settings import Settings
from tkinter import messagebox #messagebox.showinfo("Title", "a Tk MessageBox") | showerror | showwarning
        
curdir = os.path.abspath(os.path.dirname(__file__))  # Текущий каталог, где лежит программа


def get_data(filename):
    """ Тестовые данные """
    from datetime import datetime
    xdata = [datetime(2020, 5, 28, 7, 52, 1, 523000), datetime(2020, 5, 28, 7, 52, 2, 566000),
             datetime(2020, 5, 28, 7, 52, 2, 725000), datetime(2020, 5, 28, 7, 52, 2, 923000),
             datetime(2020, 5, 28, 7, 52, 3, 114000), datetime(2020, 5, 28, 7, 52, 3, 309000)]
    ydata = [1.26, 3.52, 11.85, 18.56, 4.27, 10.9]
    ypower_data = [0.0067, 0.7329000000000001, 4.3957, 3.6575, -0.8995000000000001, 5.0323]
    return (xdata, ydata, ypower_data)


def get_wheellog_data(filename):
    import csv
    from datetime import datetime as dt
    # if not filename:
    #    filename = r'e:\NEW\2020-03-10\matplotlib\wheellog\2020_05_28_07_52_00.csv'
    data = []
    with open(filename, 'r') as f:
        rdr = csv.DictReader(f)
        lspeed_avg = 0
        for i, x in enumerate(rdr):
            lspeed_avg = float(x['speed'])
            lpower = float(x['power'])
            data.append(
                {'datetime': dt.strptime(x['date'] + ' ' + x['time'], '%Y-%m-%d %H:%M:%S.%f'), 'speed': lspeed_avg,
                 'power': lpower})
    xdata = [x['datetime'] for x in data]  # [:100]
    ydata = [x['speed'] for x in data]  # [:100]
    ypower_data = [x['power'] / 100 for x in data]

    # with open(r'e:\virtualenvs\python_examples\algorithm\method_dichotomy_data.py', 'w') as fw:
    # import json, datetime
    # #dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
    # #data = json.dumps(xdata, ensure_ascii=False, default=dthandler)
    # fw.write('wheellog_data = [')
    # fw.write(','.join([x.__repr__() for x in xdata]))
    # fw.write(']')
    return (xdata, ydata, ypower_data)


def dichotomy_find_idx(arr, val):
    if arr is None or len(arr) == 0:
        return None
    idx_min = 0
    idx_max = len(arr) - 1
    while True:
        if idx_max == idx_min:
            return idx_max
        else:
            idx = (idx_max - idx_min) // 2 + idx_min
            if arr[idx] == val:
                return idx
            elif arr[idx] > val:
                idx_max = idx
            else:
                idx_min = idx + 1


def sequence_find_idx(arr, val):
    if arr is None or len(arr) == 0:
        return None
    step = 0
    for idx, a in enumerate(arr):
        if a >= val:
            print(step)
            return idx
        step += 1


class MainTk(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.mainframe = tk.Frame(self)
        self.mainframe.pack(fill='both')

        # --- Фрейм с кнопкой выбра файла ---
        fileframe = tk.Frame(self.mainframe)
        fileframe.pack(fill='both', padx=5, pady=5)

        self.button = ttk.Button(fileframe, text="File...", command=self.fileDialog)
        self.button.pack(side='left', padx=5, pady=5)

        self.label = tk.Label(fileframe, text='Выберите файл csv с данными Wheellog')
        self.label.pack(fill='both', padx=5, pady=5)


        # --- Фрейм с информацией (временно)
        self.label_info = tk.Label(self.mainframe, text='', anchor='w', bg='yellow', font=("TkFixedFont", 10), justify='left')
        self.label_info.pack(padx=5, pady=5, fill='both')
        
        self.settings_frame = tk.Frame(self.mainframe)
        self.settings_frame.pack(fill='x', padx=5, pady=5)
        self.boxinfo_var = tk.BooleanVar()
        self.checkbox_boxinfo = tk.Checkbutton(self.settings_frame, text='Инфо', variable=self.boxinfo_var)
        self.checkbox_boxinfo.select()
        self.checkbox_boxinfo.pack(side='left')

        self.clear_button = ttk.Button(self.settings_frame, text="Clear", command=self.clear_frame)
        self.clear_button.pack(side='left')
        
        # --- Фрейм на котором будет график (нужен, чтобы график потом уничтожить вместе с фреймом для загрузки нового)
        self.graphframe = tk.Frame(self.mainframe)
        self.graphframe.pack(expand=1, fill='both')

        # --- Фрейм на котором будет тулбар
        #self.toolbarframe = tk.Frame(self.mainframe, bg='blue')
        #self.toolbarframe.pack(expand=0, fill='x')

        # self.footerframe = tk.Frame(self.mainframe, bg='blue')
        # self.footerframe.pack(padx=10, pady=10, side='bottom')
        # self.footerlabel = tk.Label(self.footerframe)
        # self.footerlabel.pack(fill='x', expand=1)


        self.settings = Settings()
        if self.settings['window_width'] and self.settings['window_height']:
            self.geometry('{}x{}'.format(self.settings['window_width'], self.settings['window_height']))

        filename = self.settings['default_csv']
        self.graph_draw(filename)

        # --- Выход из программы (вынесено в ZoomPan) ---
        # self.bind('<Button-2>', lambda event: self.destroy()) # Выход по средней кнопки мыши
        # self.bind('<Escape>', lambda event: self.destroy())   # Выход по Esc
        # self.bind('<Escape>', lambda event: exit())   # Выход по Esc
        self.bind('<Escape>', self.myexit)  # Выход по Esc
        # --------------------------

    def myexit(self, event):
        # self.ax.clear()
        # self.ax.remove()
        # self.ax.axis("off")
        # self.destroy()
        exit()

    def format_coord(self, x, y):
        timeformat = matplotlib.dates.num2date(x).strftime('%H:%M:%S')

        # self.label_info.config(text='x={} y={}'.format(x, y))
        if hasattr(self, 'xdata'):
            for idx, a in enumerate(self.xdata):
                if matplotlib.dates.date2num(a) > x:
                    self.label_info.config(
                        text='Время:{} Скорость={:>6}км/ч Мощность={:>5}Вт x={:>19} y={:>19}'.format(
                            timeformat, round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100), x, y))
                    if self.scatter1:
                        self.scatter1.remove()
                    if self.scatter2:
                        self.scatter2.remove()
                    self.scatter1 = self.ax.scatter([x], [self.ydata[idx]])
                    self.scatter2 = self.ax.scatter([x], [self.ypower_data[idx]])
                    self.canvas.draw()
                    break

        # self.ax.text(x, y, 'TEST')
        # self.ax.scatter([x], [y])
        return 'Время: {} Скорость: {} км/ч Мощность: {} Вт'.format(timeformat, round(y, 1), round(y * 100, 0))

    def on_mouse_move(self, event):
        if hasattr(self, 'xdata') and event.xdata and event.ydata:
            # if event.xdata:
            # print(event.xdata, event.ydata)
            timeformat = matplotlib.dates.num2date(event.xdata).strftime('%H:%M:%S')

            # idx = sequence_find_idx(self.xdata, matplotlib.dates.num2date(event.xdata).replace(tzinfo=None))
            idx = dichotomy_find_idx(self.xdata, matplotlib.dates.num2date(event.xdata).replace(tzinfo=None))

            self.label_info.config(
                text='Время:{} Скорость={:>6}км/ч Мощность={:>5}Вт\nx={:>4} y={:>4}\nxdata={:>20} ydata={:>20}'.format(
                    timeformat, round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100),
                    event.x, event.y,
                    event.xdata, event.ydata))
            if self.scatter1:
                self.scatter1.remove()
            if self.scatter2:
                self.scatter2.remove()
            self.scatter1 = self.ax.scatter([self.xdata[idx]], [self.ydata[idx]], color=self.settings['speed_color'],
                                            s=50, alpha=1)
            self.scatter2 = self.ax.scatter([self.xdata[idx]], [self.ypower_data[idx]],
                                            color=self.settings['power_color'], alpha=0.8)


            # self.cursor_text = self.ax.text(event.xdata, event.ydata, '{}км/ч\n{}Вт'.format(round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100)))
            cursor_text_text = '{}км/ч\n{}Вт'.format(round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100))

            #if self.settings['text_near_cursor']:

            if hasattr(self, 'cursor_text') and self.cursor_text:
                self.cursor_text.remove()
                self.cursor_text = None
            if self.boxinfo_var.get():
                self.cursor_text = self.ax.text(event.xdata, event.ydata + 1, cursor_text_text,
                                                bbox=dict(facecolor='white', alpha=0.8))
                # self.cursor_text = self.ax.text(event.x, event.y, cursor_text_text, horizontalalignment='center', verticalalignment='center', transform=self.ax.transAxes)

            self.canvas.draw()

    def graph_draw(self, filename):
        # Создаем фигуру fig и оси ax
        self.fig, self.ax = matplotlib.pyplot.subplots()

        if filename and os.path.exists(filename):
            self.xdata, self.ydata, self.ypower_data = get_wheellog_data(filename)  # Данные для построения графика
            # xdata, ydata, ypower_data = get_data(filename) # Данные для построения графика
            self.ax.plot(self.xdata, self.ydata, color=self.settings['speed_color'], label="Скорость")
            self.ax.plot(self.xdata, self.ypower_data, color=self.settings['power_color'], label="Мощность Y*100",
                         linestyle='-')
        self.fig.autofmt_xdate()  # Наклонные надписи на оси X
        self.ax.set_xlabel('Время')  # Подписать ось X
        self.ax.set_ylabel('Y')  # Подписать ось Y
        # self.ax.legend() # Показать легенду
        self.ax.grid()  # Показать сетку
        self.ax.format_coord = self.format_coord  # Показ координат не как x, y, а как Время, Скорость, Мощность

        # --- Отрисовка ---
        self.graphframe.destroy()
        self.graphframe = tk.Frame()
        self.graphframe.pack(expand=1, fill='both')

        self.canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(self.fig, self.graphframe)  # Было (fig, self)
        # self.canvas.draw()
        self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        # --- Масштабирование графика ---
        zp = ZoomPan()
        zp.apply(self.ax, base_scale=1.3)

        # --- Тулбар ---
        #self.toolbarframe.destroy()
        #self.toolbarframe = tk.Frame()
        #self.toolbarframe.pack(expand=1, fill='x')

        # self.toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2Tk(self.canvas, self.toolbarframe)
        # self.toolbar.update()

        self.label.configure(text=filename)

        # self.ax.text(737573.3281182902, 20, 'TEST')
        # self.scatter = self.ax.scatter([737573.3281182902], [20])
        self.scatter1 = None
        self.scatter2 = None
        self.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)

    def fileDialog(self):
        self.filename = filedialog.askopenfilename(initialdir=curdir, title="Select A File",
                                                   filetypes=(("csv files", "*.csv"), ("All files", "*.*")))
        if self.filename:
            self.graph_draw(self.filename)
    
    def clear_frame(self):
        self.graph_draw('')
        #messagebox.showinfo("Clear", "Cleared")
        
        
    def destroy(self):
        exit()  # Для полного выхода по закрытию программы


if __name__ == '__main__':
    app = MainTk()
    app.mainloop()

import tkinter as tk
from tkinter import ttk
from tkinter import filedialog
import os
import matplotlib
import matplotlib.pyplot
from tk_zoom import ZoomPan
from settings import Settings
from tkinter import messagebox #messagebox.showinfo("Title", "a Tk MessageBox") | showerror | showwarning
        
curdir = os.path.abspath(os.path.dirname(__file__))  # Текущий каталог, где лежит программа


def get_data(filename):
    """ Тестовые данные """
    from datetime import datetime
    xdata = [datetime(2020, 5, 28, 7, 52, 1, 523000), datetime(2020, 5, 28, 7, 52, 2, 566000),
             datetime(2020, 5, 28, 7, 52, 2, 725000), datetime(2020, 5, 28, 7, 52, 2, 923000),
             datetime(2020, 5, 28, 7, 52, 3, 114000), datetime(2020, 5, 28, 7, 52, 3, 309000)]
    ydata = [1.26, 3.52, 11.85, 18.56, 4.27, 10.9]
    ypower_data = [0.0067, 0.7329000000000001, 4.3957, 3.6575, -0.8995000000000001, 5.0323]
    return (xdata, ydata, ypower_data)


def get_wheellog_data(filename):
    import csv
    from datetime import datetime as dt
    # if not filename:
    #    filename = r'e:\NEW\2020-03-10\matplotlib\wheellog\2020_05_28_07_52_00.csv'
    data = []
    with open(filename, 'r') as f:
        rdr = csv.DictReader(f)
        lspeed_avg = 0
        for i, x in enumerate(rdr):
            lspeed_avg = float(x['speed'])
            lpower = float(x['power'])
            data.append(
                {'datetime': dt.strptime(x['date'] + ' ' + x['time'], '%Y-%m-%d %H:%M:%S.%f'), 'speed': lspeed_avg,
                 'power': lpower})
    xdata = [x['datetime'] for x in data]  # [:100]
    ydata = [x['speed'] for x in data]  # [:100]
    ypower_data = [x['power'] / 100 for x in data]

    # with open(r'e:\virtualenvs\python_examples\algorithm\method_dichotomy_data.py', 'w') as fw:
    # import json, datetime
    # #dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None
    # #data = json.dumps(xdata, ensure_ascii=False, default=dthandler)
    # fw.write('wheellog_data = [')
    # fw.write(','.join([x.__repr__() for x in xdata]))
    # fw.write(']')
    return (xdata, ydata, ypower_data)


def dichotomy_find_idx(arr, val):
    if arr is None or len(arr) == 0:
        return None
    idx_min = 0
    idx_max = len(arr) - 1
    while True:
        if idx_max == idx_min:
            return idx_max
        else:
            idx = (idx_max - idx_min) // 2 + idx_min
            if arr[idx] == val:
                return idx
            elif arr[idx] > val:
                idx_max = idx
            else:
                idx_min = idx + 1


def sequence_find_idx(arr, val):
    if arr is None or len(arr) == 0:
        return None
    step = 0
    for idx, a in enumerate(arr):
        if a >= val:
            print(step)
            return idx
        step += 1


class MainTk(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.mainframe = tk.Frame(self)
        self.mainframe.pack(fill='both')

        # --- Фрейм с кнопкой выбра файла ---
        fileframe = tk.Frame(self.mainframe)
        fileframe.pack(fill='both', padx=5, pady=5)

        self.button = ttk.Button(fileframe, text="File...", command=self.fileDialog)
        self.button.pack(side='left', padx=5, pady=5)

        self.label = tk.Label(fileframe, text='Выберите файл csv с данными Wheellog')
        self.label.pack(fill='both', padx=5, pady=5)


        # --- Фрейм с информацией (временно)
        self.label_info = tk.Label(self.mainframe, text='', anchor='w', bg='yellow', font=("TkFixedFont", 10), justify='left')
        self.label_info.pack(padx=5, pady=5, fill='both')
        
        self.settings_frame = tk.Frame(self.mainframe)
        self.settings_frame.pack(fill='x', padx=5, pady=5)
        self.boxinfo_var = tk.BooleanVar()
        self.checkbox_boxinfo = tk.Checkbutton(self.settings_frame, text='Инфо', variable=self.boxinfo_var)
        self.checkbox_boxinfo.select()
        self.checkbox_boxinfo.pack(side='left')

        self.clear_button = ttk.Button(self.settings_frame, text="Clear", command=self.clear_frame)
        self.clear_button.pack(side='left')
        
        # --- Фрейм на котором будет график (нужен, чтобы график потом уничтожить вместе с фреймом для загрузки нового)
        self.graphframe = tk.Frame(self.mainframe)
        self.graphframe.pack(expand=1, fill='both')

        # --- Фрейм на котором будет тулбар
        #self.toolbarframe = tk.Frame(self.mainframe, bg='blue')
        #self.toolbarframe.pack(expand=0, fill='x')

        # self.footerframe = tk.Frame(self.mainframe, bg='blue')
        # self.footerframe.pack(padx=10, pady=10, side='bottom')
        # self.footerlabel = tk.Label(self.footerframe)
        # self.footerlabel.pack(fill='x', expand=1)


        self.settings = Settings()
        if self.settings['window_width'] and self.settings['window_height']:
            self.geometry('{}x{}'.format(self.settings['window_width'], self.settings['window_height']))

        filename = self.settings['default_csv']
        self.graph_draw(filename)

        # --- Выход из программы (вынесено в ZoomPan) ---
        # self.bind('<Button-2>', lambda event: self.destroy()) # Выход по средней кнопки мыши
        # self.bind('<Escape>', lambda event: self.destroy())   # Выход по Esc
        # self.bind('<Escape>', lambda event: exit())   # Выход по Esc
        self.bind('<Escape>', self.myexit)  # Выход по Esc
        # --------------------------

    def myexit(self, event):
        # self.ax.clear()
        # self.ax.remove()
        # self.ax.axis("off")
        # self.destroy()
        exit()

    def format_coord(self, x, y):
        timeformat = matplotlib.dates.num2date(x).strftime('%H:%M:%S')

        # self.label_info.config(text='x={} y={}'.format(x, y))
        if hasattr(self, 'xdata'):
            for idx, a in enumerate(self.xdata):
                if matplotlib.dates.date2num(a) > x:
                    self.label_info.config(
                        text='Время:{} Скорость={:>6}км/ч Мощность={:>5}Вт x={:>19} y={:>19}'.format(
                            timeformat, round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100), x, y))
                    if self.scatter1:
                        self.scatter1.remove()
                    if self.scatter2:
                        self.scatter2.remove()
                    self.scatter1 = self.ax.scatter([x], [self.ydata[idx]])
                    self.scatter2 = self.ax.scatter([x], [self.ypower_data[idx]])
                    self.canvas.draw()
                    break

        # self.ax.text(x, y, 'TEST')
        # self.ax.scatter([x], [y])
        return 'Время: {} Скорость: {} км/ч Мощность: {} Вт'.format(timeformat, round(y, 1), round(y * 100, 0))

    def on_mouse_move(self, event):
        if hasattr(self, 'xdata') and event.xdata and event.ydata:
            # if event.xdata:
            # print(event.xdata, event.ydata)
            timeformat = matplotlib.dates.num2date(event.xdata).strftime('%H:%M:%S')

            # idx = sequence_find_idx(self.xdata, matplotlib.dates.num2date(event.xdata).replace(tzinfo=None))
            idx = dichotomy_find_idx(self.xdata, matplotlib.dates.num2date(event.xdata).replace(tzinfo=None))

            self.label_info.config(
                text='Время:{} Скорость={:>6}км/ч Мощность={:>5}Вт\nx={:>4} y={:>4}\nxdata={:>20} ydata={:>20}'.format(
                    timeformat, round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100),
                    event.x, event.y,
                    event.xdata, event.ydata))
            if self.scatter1:
                self.scatter1.remove()
            if self.scatter2:
                self.scatter2.remove()
            self.scatter1 = self.ax.scatter([self.xdata[idx]], [self.ydata[idx]], color=self.settings['speed_color'],
                                            s=50, alpha=1)
            self.scatter2 = self.ax.scatter([self.xdata[idx]], [self.ypower_data[idx]],
                                            color=self.settings['power_color'], alpha=0.8)


            # self.cursor_text = self.ax.text(event.xdata, event.ydata, '{}км/ч\n{}Вт'.format(round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100)))
            cursor_text_text = '{}км/ч\n{}Вт'.format(round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100))

            #if self.settings['text_near_cursor']:

            if hasattr(self, 'cursor_text') and self.cursor_text:
                self.cursor_text.remove()
                self.cursor_text = None
            if self.boxinfo_var.get():
                self.cursor_text = self.ax.text(event.xdata, event.ydata + 1, cursor_text_text,
                                                bbox=dict(facecolor='white', alpha=0.8))
                # self.cursor_text = self.ax.text(event.x, event.y, cursor_text_text, horizontalalignment='center', verticalalignment='center', transform=self.ax.transAxes)

            self.canvas.draw()

    def graph_draw(self, filename):
        # Создаем фигуру fig и оси ax
        self.fig, self.ax = matplotlib.pyplot.subplots()

        if filename and os.path.exists(filename):
            self.xdata, self.ydata, self.ypower_data = get_wheellog_data(filename)  # Данные для построения графика
            # xdata, ydata, ypower_data = get_data(filename) # Данные для построения графика
            self.ax.plot(self.xdata, self.ydata, color=self.settings['speed_color'], label="Скорость")
            self.ax.plot(self.xdata, self.ypower_data, color=self.settings['power_color'], label="Мощность Y*100",
                         linestyle='-')
        self.fig.autofmt_xdate()  # Наклонные надписи на оси X
        self.ax.set_xlabel('Время')  # Подписать ось X
        self.ax.set_ylabel('Y')  # Подписать ось Y
        # self.ax.legend() # Показать легенду
        self.ax.grid()  # Показать сетку
        self.ax.format_coord = self.format_coord  # Показ координат не как x, y, а как Время, Скорость, Мощность

        # --- Отрисовка ---
        self.graphframe.destroy()
        self.graphframe = tk.Frame()
        self.graphframe.pack(expand=1, fill='both')

        self.canvas = matplotlib.backends.backend_tkagg.FigureCanvasTkAgg(self.fig, self.graphframe)  # Было (fig, self)
        # self.canvas.draw()
        self.canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        # --- Масштабирование графика ---
        zp = ZoomPan()
        zp.apply(self.ax, base_scale=1.3)

        # --- Тулбар ---
        #self.toolbarframe.destroy()
        #self.toolbarframe = tk.Frame()
        #self.toolbarframe.pack(expand=1, fill='x')

        # self.toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2Tk(self.canvas, self.toolbarframe)
        # self.toolbar.update()

        self.label.configure(text=filename)

        # self.ax.text(737573.3281182902, 20, 'TEST')
        # self.scatter = self.ax.scatter([737573.3281182902], [20])
        self.scatter1 = None
        self.scatter2 = None
        self.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)

    def fileDialog(self):
        self.filename = filedialog.askopenfilename(initialdir=curdir, title="Select A File",
                                                   filetypes=(("csv files", "*.csv"), ("All files", "*.*")))
        if self.filename:
            self.graph_draw(self.filename)
    
    def clear_frame(self):
        self.graph_draw('')
        #messagebox.showinfo("Clear", "Cleared")
        
        
    def destroy(self):
        exit()  # Для полного выхода по закрытию программы


if __name__ == '__main__':
    app = MainTk()
    app.mainloop()
#messagebox.showinfo("Title", "a Tk MessageBox") | showerror | showwarning # Текущий каталог, где лежит программа Тестовые данные # if not filename: #    filename = r'e:\NEW\2020-03-10\matplotlib\wheellog\2020_05_28_07_52_00.csv' # [:100] # [:100] # with open(r'e:\virtualenvs\python_examples\algorithm\method_dichotomy_data.py', 'w') as fw: # import json, datetime # #dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) else None # #data = json.dumps(xdata, ensure_ascii=False, default=dthandler) # fw.write('wheellog_data = [') # fw.write(','.join([x.__repr__() for x in xdata])) # fw.write(']') # --- Фрейм с кнопкой выбра файла --- # --- Фрейм с информацией (временно) # --- Фрейм на котором будет график (нужен, чтобы график потом уничтожить вместе с фреймом для загрузки нового) # --- Фрейм на котором будет тулбар #self.toolbarframe = tk.Frame(self.mainframe, bg='blue') #self.toolbarframe.pack(expand=0, fill='x') # self.footerframe = tk.Frame(self.mainframe, bg='blue') # self.footerframe.pack(padx=10, pady=10, side='bottom') # self.footerlabel = tk.Label(self.footerframe) # self.footerlabel.pack(fill='x', expand=1) # --- Выход из программы (вынесено в ZoomPan) --- # self.bind('<Button-2>', lambda event: self.destroy()) # Выход по средней кнопки мыши # self.bind('<Escape>', lambda event: self.destroy())   # Выход по Esc # self.bind('<Escape>', lambda event: exit())   # Выход по Esc # Выход по Esc # -------------------------- # self.ax.clear() # self.ax.remove() # self.ax.axis("off") # self.destroy() # self.label_info.config(text='x={} y={}'.format(x, y)) # self.ax.text(x, y, 'TEST') # self.ax.scatter([x], [y]) # if event.xdata: # print(event.xdata, event.ydata) # idx = sequence_find_idx(self.xdata, matplotlib.dates.num2date(event.xdata).replace(tzinfo=None)) # self.cursor_text = self.ax.text(event.xdata, event.ydata, '{}км/ч\n{}Вт'.format(round(self.ydata[idx], 1), round(self.ypower_data[idx] * 100))) #if self.settings['text_near_cursor']: # self.cursor_text = self.ax.text(event.x, event.y, cursor_text_text, horizontalalignment='center', verticalalignment='center', transform=self.ax.transAxes) # Создаем фигуру fig и оси ax # Данные для построения графика # xdata, ydata, ypower_data = get_data(filename) # Данные для построения графика # Наклонные надписи на оси X # Подписать ось X # Подписать ось Y # self.ax.legend() # Показать легенду # Показать сетку # Показ координат не как x, y, а как Время, Скорость, Мощность # --- Отрисовка --- # Было (fig, self) # self.canvas.draw() # --- Масштабирование графика --- # --- Тулбар --- #self.toolbarframe.destroy() #self.toolbarframe = tk.Frame() #self.toolbarframe.pack(expand=1, fill='x') # self.toolbar = matplotlib.backends.backend_tkagg.NavigationToolbar2Tk(self.canvas, self.toolbarframe) # self.toolbar.update() # self.ax.text(737573.3281182902, 20, 'TEST') # self.scatter = self.ax.scatter([737573.3281182902], [20]) #messagebox.showinfo("Clear", "Cleared") # Для полного выхода по закрытию программы