sweaver Posted March 24, 2019 Share Posted March 24, 2019 Hi All, I record my dry fire and live fire par times with an android app called "Dry Fire Par Timer" found here -> https://play.google.com/store/apps/details?id=com.csl1911a1.dryfirepartimer&hl=en_US I wanted a way to graph the par times for each drill over time and was also looking to learn python so I took this opportunity to write my first python application. To use it copy the the "Dry Fire Par Timer" apps database ( dryfire.db ) to your computer and open it with this python application. I tested it in Linux ( Fedora 29 ) and Windows 10. I'm sure there are some bugs and it's It's not great, just something I did with my spare time. Feel free to use to and provide any feed back or code changes / bug fixes. #!/usr/bin/env python3 import os import sqlite3 from tkinter import filedialog from tkinter import * import tkinter as tk import matplotlib.pyplot as plt from dateutil import parser from matplotlib import style style.use('fivethirtyeight') def get_drills(): c.execute('SELECT _id,event_name FROM dry_fire_event order by event_name') global data data = c.fetchall() def create_list(): my_label_frame = tk.Frame(root, bd=5) my_label_frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n') my_label = tk.Label(my_label_frame, text="Select a Drill") my_label.pack(side='top') global drill_number global drill_name my_drill_frame = tk.Frame(root, bd=5) my_drill_frame.place(relx=0.5, rely=0.15, relwidth=0.75, relheight=100, anchor='n') my_drill_listbox = tk.Listbox(root, bd=5) my_drill_listbox.place(relx=0.5, rely=0.15, relwidth=0.75, relheight=0.75, anchor='n') my_drill_listbox.bind('<<ListboxSelect>>', on_select) scrollbar = Scrollbar(my_drill_listbox) scrollbar.pack(side=RIGHT, fill=Y) for drill_number, drill_name in data: my_drill_listbox.insert(END, drill_name) my_drill_listbox.config(yscrollcommand=scrollbar.set) scrollbar.config(command=my_drill_listbox.yview) def graph_data(): c.execute('SELECT par_time,date_add from dry_fire_history WHERE fk_event_id = ? order by date_add desc', (graph_drill_number,)) data_graph = c.fetchall() dates = [] par_times = [] for row in data_graph: dates.append(parser.parse(row[1])) par_times.append(row[0]) plt.figure('Dryfire Drills', figsize=(my_fig_width, my_fig_height), dpi=80) plt.title(graph_drill_name, ) plt.ylabel('Par Time') plt.xlabel('Date/Time') plt.plot_date(dates, par_times, '-') plt.show() def open_db_button(): open_button_popup_filename = filedialog.askopenfilename(title="Select Database to Open", initialdir=os.getcwd(), filetypes=(("Database File", "*.db"), ("All Files", "*.*"))) global conn global c conn = sqlite3.connect(open_button_popup_filename) c = conn.cursor() get_drills() create_drill_button() create_list() tk.Button.destroy(my_open_button) def create_drill_button(): my_drill_button = tk.Button(my_button_frame, text="Graph Selected Drill", command=graph_data) my_drill_button.pack(side='right') def on_select(evt): w = evt.widget index = int(w.curselection()[0]) drill = data[index] global graph_drill_number global graph_drill_name graph_drill_number = drill[0] graph_drill_name = drill[1] my_width = 900 my_height = 800 my_fig_width = 12 my_fig_height = 8 root = tk.Tk() root.wm_title("Graph Drills") my_canvas = tk.Canvas(root, height=my_height, width=my_width) my_canvas.pack() my_button_frame = tk.Frame(root, bd=5) my_button_frame.place(relx=0.5, rely=0, relwidth=0.75, relheight=0.1, anchor='n') my_open_button = tk.Button(my_button_frame, text="Open Drills Database", command=open_db_button) my_open_button.pack(side='left') root.mainloop() c.close() conn.close() graph_dryfire_drills.py Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now