Advertisement
MilkyDoritos

gui.py

May 21st, 2021
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.06 KB | None | 0 0
  1. import tkinter as tk
  2. from tkinter import messagebox
  3. from db import Database
  4.  
  5. db = Database('tunes.db')
  6.  
  7. class Application(tk.Frame):
  8.     def __init__(self, master):
  9.         super().__init__(master)
  10.         self.master = master
  11.         master.title('Drift Tuner')
  12.         self.create_widgets()
  13.         self.save_window()
  14.         self.load_tune()
  15.         self.selected_item = 0
  16.         self.populate_list()
  17.  
  18.     def create_widgets(self):
  19.         rows = 0
  20.         while rows < 13:
  21.             self.master.columnconfigure(rows, minsize=25)
  22.             self.master.rowconfigure(rows, minsize=25)
  23.             rows += 1
  24.         # Front
  25.         self.front_label = tk.Label(self.master, text='Front Percentage', font=('bold'), pady=5)
  26.         self.front_label.grid(row=0, column=0, sticky=tk.S, columnspan=4)
  27.         # Percentage
  28.         self.front_text = tk.StringVar()
  29.         self.front_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  30.         self.front_label.grid(row=1, column=1, sticky=tk.E)
  31.         self.front_entry = tk.Entry(self.master, textvariable=self.front_text, width=8, font=('bold', 10))
  32.         self.front_entry.grid(row=1, column=2)
  33.  
  34.         # AntiRoll Bars
  35.         # AntiRool Bars category
  36.         self.antiroll_label = tk.Label(self.master, text='Antiroll Bars | Antiroll Bars', font=('bold'), pady=5)
  37.         self.antiroll_label.grid(row=2, column=0, sticky=tk.S, columnspan=4)
  38.         # Max
  39.         self.armax_text = tk.StringVar()
  40.         self.armax_label = tk.Label(self.master, text='Max', pady=5, font=('bold', 12))
  41.         self.armax_label.grid(row=3, column=0, sticky=tk.E)
  42.         self.armax_entry = tk.Entry(self.master, textvariable=self.armax_text, width=8, font=('bold', 10))
  43.         self.armax_entry.grid(row=3, column=1)
  44.         # Min
  45.         self.armin_text = tk.StringVar()
  46.         self.armin_label = tk.Label(self.master, text='Min', font=('bold', 12))
  47.         self.armin_label.grid(row=3, column=2, sticky=tk.E)
  48.         self.armin_entry = tk.Entry(self.master, textvariable=self.armin_text, width=8, font=('bold', 10))
  49.         self.armin_entry.grid(row=3, column=3)
  50.  
  51.         # Springs
  52.         # Springs category
  53.         self.springs_label = tk.Label(self.master, text='Springs | Springs', font=('bold'), pady=5)
  54.         self.springs_label.grid(row=0, column=5, sticky=tk.S, columnspan=4)
  55.         # Max
  56.         self.springmax_text = tk.StringVar()
  57.         self.springmax_label = tk.Label(self.master, text='Max', pady=5, font=('bold', 12))
  58.         self.springmax_label.grid(row=1, column=5, sticky=tk.E)
  59.         self.springmax_entry = tk.Entry(self.master, textvariable=self.springmax_text, width=8, font=('bold', 10))
  60.         self.springmax_entry.grid(row=1, column=6)
  61.         # Min
  62.         self.springmin_text = tk.StringVar()
  63.         self.springmin_label = tk.Label(self.master, text='Min', font=('bold', 12))
  64.         self.springmin_label.grid(row=1, column=7, sticky=tk.E)
  65.         self.springmin_entry = tk.Entry(self.master, textvariable=self.springmin_text, width=8, font=('bold', 10))
  66.         self.springmin_entry.grid(row=1, column=8)
  67.  
  68.         # Ride Height category
  69.         self.rideheight_label = tk.Label(self.master, text='Springs | Ride Height', font=('bold'), pady=5)
  70.         self.rideheight_label.grid(row=2, column=5, sticky=tk.S, columnspan=4)
  71.         # Max
  72.         self.rideheightmax_text = tk.StringVar()
  73.         self.rideheightmax_label = tk.Label(self.master, text='Max', pady=5, font=('bold', 12))
  74.         self.rideheightmax_label.grid(row=3, column=5, sticky=tk.E)
  75.         self.rideheightmax_entry = tk.Entry(self.master, textvariable=self.rideheightmax_text, width=8, font=('bold', 10))
  76.         self.rideheightmax_entry.grid(row=3, column=6)
  77.         # Min
  78.         self.rideheightmin_text = tk.StringVar()
  79.         self.rideheightmin_label = tk.Label(self.master, text='Min', font=('bold', 12))
  80.         self.rideheightmin_label.grid(row=3, column=7, sticky=tk.E)
  81.         self.rideheightmin_entry = tk.Entry(self.master, textvariable=self.rideheightmin_text, width=8, font=('bold', 10))
  82.         self.rideheightmin_entry.grid(row=3, column=8)
  83.  
  84.         # Damping
  85.         # Rebound category
  86.         self.rebound_label = tk.Label(self.master, text='Damping | Rebound', font=('bold'), pady=5)
  87.         self.rebound_label.grid(row=0, column=10, sticky=tk.S, columnspan=4)
  88.         # Max
  89.         self.reboundmax_text = tk.StringVar()
  90.         self.reboundmax_label = tk.Label(self.master, text='Max', pady=5, font=('bold', 12))
  91.         self.reboundmax_label.grid(row=1, column=10, sticky=tk.E)
  92.         self.reboundmax_entry = tk.Entry(self.master, textvariable=self.reboundmax_text, width=8, font=('bold', 10))
  93.         self.reboundmax_entry.grid(row=1, column=11)
  94.         # Min
  95.         self.reboundmin_text = tk.StringVar()
  96.         self.reboundmin_label = tk.Label(self.master, text='Min', font=('bold', 12))
  97.         self.reboundmin_label.grid(row=1, column=12, sticky=tk.E)
  98.         self.reboundmin_entry = tk.Entry(self.master, textvariable=self.reboundmin_text, width=8, font=('bold', 10))
  99.         self.reboundmin_entry.grid(row=1, column=13)
  100.  
  101.         # Rear
  102.         self.rear_label = tk.Label(self.master, text='Rear Percentage', font=('bold'), pady=5)
  103.         self.rear_label.grid(row=7, column=0, sticky=tk.S, columnspan=4)
  104.         # Percentage
  105.         self.rear_text = tk.StringVar()
  106.         self.rear_label = tk.Label(self.master, text='Rear', pady=5, font=('bold', 12))
  107.         self.rear_label.grid(row=8, column=1, sticky=tk.E)
  108.         self.rear_output = tk.Entry(self.master, textvariable=self.rear_text, width=8, font=('bold', 10))
  109.         self.rear_output.grid(row=8, column=2)
  110.         self.rear_output.bind("<Button-1>", lambda e: "break")
  111.         self.rear_output.bind("<Key>", lambda e: "break")
  112.  
  113.         # AntiRoll Bars
  114.         # AntiRool Bars category
  115.         self.antiroll_label = tk.Label(self.master, text='Antiroll Bars | Antiroll Bars', font=('bold'), pady=5)
  116.         self.antiroll_label.grid(row=9, column=0, sticky=tk.S, columnspan=4)
  117.         # Front
  118.         self.arfront_text = tk.StringVar()
  119.         self.arfront_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  120.         self.arfront_label.grid(row=10, column=0, sticky=tk.E)
  121.         self.arfront_output = tk.Entry(self.master, textvariable=self.arfront_text, width=8, font=('bold', 10))
  122.         self.arfront_output.grid(row=10, column=1)
  123.         self.arfront_output.bind("<Button-1>", lambda e: "break")
  124.         self.arfront_output.bind("<Key>", lambda e: "break")
  125.         # Rear
  126.         self.arrear_text = tk.StringVar()
  127.         self.arrear_label = tk.Label(self.master, text='Rear', font=('bold', 12))
  128.         self.arrear_label.grid(row=10, column=2, sticky=tk.E)
  129.         self.arrear_output = tk.Entry(self.master, textvariable=self.arrear_text, width=8, font=('bold', 10))
  130.         self.arrear_output.grid(row=10, column=3)
  131.         self.arrear_output.bind("<Button-1>", lambda e: "break")
  132.         self.arrear_output.bind("<Key>", lambda e: "break")
  133.  
  134.         # Springs
  135.         # Springs category
  136.         self.springs_label = tk.Label(self.master, text='Springs | Springs', font=('bold'), pady=5)
  137.         self.springs_label.grid(row=7, column=5, sticky=tk.S, columnspan=4)
  138.         # Front
  139.         self.springfront_text = tk.StringVar()
  140.         self.springfront_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  141.         self.springfront_label.grid(row=8, column=5, sticky=tk.E)
  142.         self.springfront_output = tk.Entry(self.master, textvariable=self.springfront_text, width=8, font=('bold', 10))
  143.         self.springfront_output.grid(row=8, column=6)
  144.         self.springfront_output.bind("<Button-1>", lambda e: "break")
  145.         self.springfront_output.bind("<Key>", lambda e: "break")
  146.         # Rear
  147.         self.springrear_text = tk.StringVar()
  148.         self.springrear_label = tk.Label(self.master, text='Rear', font=('bold', 12))
  149.         self.springrear_label.grid(row=8, column=7, sticky=tk.E)
  150.         self.springrear_output = tk.Entry(self.master, textvariable=self.springrear_text, width=8, font=('bold', 10))
  151.         self.springrear_output.grid(row=8, column=8)
  152.         self.springrear_output.bind("<Button-1>", lambda e: "break")
  153.         self.springrear_output.bind("<Key>", lambda e: "break")
  154.  
  155.         # Ride Height category
  156.         self.rideheight_label = tk.Label(self.master, text='Springs | Ride Height', font=('bold'), pady=5)
  157.         self.rideheight_label.grid(row=9, column=5, sticky=tk.S, columnspan=4)
  158.         # Front
  159.         self.rideheightfront_text = tk.StringVar()
  160.         self.rideheightfront_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  161.         self.rideheightfront_label.grid(row=10, column=5, sticky=tk.E)
  162.         self.rideheightfront_output = tk.Entry(self.master, textvariable=self.rideheightfront_text, width=8, font=('bold', 10))
  163.         self.rideheightfront_output.grid(row=10, column=6)
  164.         self.rideheightfront_output.bind("<Button-1>", lambda e: "break")
  165.         self.rideheightfront_output.bind("<Key>", lambda e: "break")
  166.         # Rear
  167.         self.rideheightrear_text = tk.StringVar()
  168.         self.rideheightrear_label = tk.Label(self.master, text='Rear', font=('bold', 12))
  169.         self.rideheightrear_label.grid(row=10, column=7, sticky=tk.E)
  170.         self.rideheightrear_output = tk.Entry(self.master, textvariable=self.rideheightrear_text, width=8, font=('bold', 10))
  171.         self.rideheightrear_output.grid(row=10, column=8)
  172.         self.rideheightrear_output.bind("<Button-1>", lambda e: "break")
  173.         self.rideheightrear_output.bind("<Key>", lambda e: "break")
  174.  
  175.         # Damping
  176.         # Rebound category
  177.         self.rebound_label = tk.Label(self.master, text='Damping | Rebound', font=('bold'), pady=5)
  178.         self.rebound_label.grid(row=7, column=10, sticky=tk.S, columnspan=4)
  179.         # Front
  180.         self.reboundfront_text = tk.StringVar()
  181.         self.reboundfront_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  182.         self.reboundfront_label.grid(row=8, column=10, sticky=tk.E)
  183.         self.reboundfront_output = tk.Entry(self.master, textvariable=self.reboundfront_text, width=8, font=('bold', 10))
  184.         self.reboundfront_output.grid(row=8, column=11)
  185.         self.reboundfront_output.bind("<Button-1>", lambda e: "break")
  186.         self.reboundfront_output.bind("<Key>", lambda e: "break")
  187.         # Rear
  188.         self.reboundrear_text = tk.StringVar()
  189.         self.reboundrear_label = tk.Label(self.master, text='Rear', font=('bold', 12))
  190.         self.reboundrear_label.grid(row=8, column=12, sticky=tk.E)
  191.         self.reboundrear_output = tk.Entry(self.master, textvariable=self.reboundrear_text, width=8, font=('bold', 10))
  192.         self.reboundrear_output.grid(row=8, column=13)
  193.         self.reboundrear_output.bind("<Button-1>", lambda e: "break")
  194.         self.reboundrear_output.bind("<Key>", lambda e: "break")
  195.         # Bump category
  196.         self.bump_label = tk.Label(self.master, text='Damping | Bump', font=('bold'), pady=5)
  197.         self.bump_label.grid(row=9, column=10, sticky=tk.S, columnspan=4)
  198.         # Front
  199.         self.bumpfront_text = tk.StringVar()
  200.         self.bumpfront_label = tk.Label(self.master, text='Front', pady=5, font=('bold', 12))
  201.         self.bumpfront_label.grid(row=10, column=10, sticky=tk.E)
  202.         self.bumpfront_output = tk.Entry(self.master, textvariable=self.bumpfront_text, width=8, font=('bold', 10))
  203.         self.bumpfront_output.grid(row=10, column=11)
  204.         self.bumpfront_output.bind("<Button-1>", lambda e: "break")
  205.         self.bumpfront_output.bind("<Key>", lambda e: "break")
  206.         # Rear
  207.         self.bumprear_text = tk.StringVar()
  208.         self.bumprear_label = tk.Label(self.master, text='Rear', font=('bold', 12))
  209.         self.bumprear_label.grid(row=10, column=12, sticky=tk.E)
  210.         self.bumprear_output = tk.Entry(self.master, textvariable=self.bumprear_text, width=8, font=('bold', 10))
  211.         self.bumprear_output.grid(row=10, column=13)
  212.         self.bumprear_output.bind("<Button-1>", lambda e: "break")
  213.         self.bumprear_output.bind("<Key>", lambda e: "break")
  214.  
  215.         # Buttons
  216.         self.calculate_button = tk.Button(self.master, text='Calculate', width=15, command=self.calculate_tune)
  217.         self.calculate_button.grid(row=5, column=3, columnspan=2)
  218.  
  219.         self.help_button = tk.Button(self.master, text='Help/Info', width=15, command=self.show_help)
  220.         self.help_button.grid(row=5, column=1, columnspan=2)
  221.  
  222.         self.cleartext_button = tk.Button(self.master, text='Clear Inputs', width=15, command=self.clear_text)
  223.         self.cleartext_button.grid(row=5, column=5, columnspan=2)
  224.  
  225.         self.clearoutput_button = tk.Button(self.master, text='Clear Outputs', width=15, command=self.clear_output)
  226.         self.clearoutput_button.grid(row=5, column=7, columnspan=2)
  227.  
  228.         self.save_button = tk.Button(self.master, text='Save Tune', width=15, command=self.save_window)
  229.         self.save_button.grid(row=5, column=9, columnspan=2)
  230.  
  231.         self.load_button = tk.Button(self.master, text='Load Tune', width=15, command=self.load_window)
  232.         self.load_button.grid(row=5, column=11, columnspan=2)
  233.  
  234.     def equation(self, A, B, C):
  235.         x = (((A-B)*C)+B)
  236.         return x
  237.  
  238.     def calculate_tune(self):
  239.         try:
  240.             (float(self.front_text.get()), float(self.armax_entry.get()), float(self.armin_entry.get()), float(self.springmax_entry.get()), float(self.springmin_entry.get()), float(self.rideheightmax_entry.get()), float(self.rideheightmin_entry.get()), float(self.reboundmax_entry.get()), float(self.reboundmin_entry.get()))
  241.         except ValueError:
  242.             messagebox.showerror('Values', 'Please fill out everything with proper values')
  243.             return
  244.         if float(self.front_text.get()) > 1 or float(self.front_text.get()) < 0:
  245.             messagebox.showerror('Front Percentage', 'Please make sure the front perentage has the format 0.##')
  246.             return
  247.         self.front = float(self.front_text.get())
  248.         self.rear = 1-self.front
  249.         self.rear_output.delete(0, tk.END)
  250.         self.rear_output.insert(tk.END, self.rear)
  251.         self.set_values(self.arfront_output, self.armax_text, self.armin_text, self.front)
  252.         self.set_values(self.arrear_output, self.armax_text, self.armin_text, self.rear)
  253.         self.set_values(self.springfront_output, self.springmax_text, self.springmin_text, self.front)
  254.         self.set_values(self.springrear_output, self.springmax_text, self.springmin_text, self.rear)
  255.         self.rideheightfront_output.delete(0, tk.END)
  256.         self.rideheightfront_output.insert(tk.END, float(self.rideheightmin_entry.get())+0.4)
  257.         self.rideheightrear_output.delete(0, tk.END)
  258.         self.rideheightrear_output.insert(tk.END, float(self.rideheightmin_entry.get()))
  259.         self.set_values(self.reboundfront_output, self.reboundmax_text, self.reboundmin_text, self.front)
  260.         self.set_values(self.reboundrear_output, self.reboundmax_text, self.reboundmin_text, self.rear)
  261.         self.bumpfront_output.delete(0, tk.END)
  262.         self.bumpfront_output.insert(tk.END, (self.equation(float(self.reboundmax_text.get()), float(self.reboundmin_text.get()), self.front))*0.5)
  263.         self.bumprear_output.delete(0, tk.END)
  264.         self.bumprear_output.insert(tk.END, (self.equation(float(self.reboundmax_text.get()), float(self.reboundmin_text.get()), self.rear))*0.5)
  265.    
  266.     def save_window(self):
  267.         self.save = tk.Toplevel(self.master)
  268.         self.save.title('Save')
  269.         self.save_text = tk.StringVar()
  270.         self.label_label = tk.Label(self.save, text='Save Your Tune', font=('bold', 12), pady=5)
  271.         self.label_label.grid(row=0, column=0, columnspan=2)
  272.         self.save_label = tk.Label(self.save, text='Copy and Save This ID', font=('bold', 10))
  273.         self.save_label.grid(row=1, column=0, sticky=tk.E)
  274.         self.save_entry = tk.Entry(self.save, textvariable=self.save_text, width=15)
  275.         self.save_entry.grid(row=1, column=1)
  276.         self.save_button = tk.Button(self.save, text='Save Tune', width=15, command=self.save_tune)
  277.         self.save_button.grid(row=2, column=0, columnspan=2)
  278.         self.save_entry.bind("<Key>", lambda e: "break")
  279.  
  280.     def load_window(self):
  281.         self.load = tk.Toplevel(self.master)
  282.         self.load.title('Load')
  283.         self.tunes_list = tk.Listbox(self.load, height=8, width=50, border=0)
  284.         self.tunes_list.grid(row=0, column=0, columnspan=3, rowspan=6, pady=5, padx=5)
  285.  
  286.         self.scrollbar = tk.Scrollbar(self.load)
  287.         self.scrollbar.grid(row=0, column=3, pady=0, padx=5)
  288.         self.tunes_list.configure(yscrollcommand=self.scrollbar.set)
  289.         self.scrollbar.configure(command=self.tunes_list.yview)
  290.         self.tunes_list.bind('<<ListboxSelect>>', self.select_item)
  291.  
  292.         self.remove_button = tk.Button(self.load, text="Remove Tune", width=15, command=self.remove_item)
  293.         self.remove_button.grid(row=6, column=1)
  294.  
  295.         self.load_button = tk.Button(self.load, text="Load Tune", width=15, command=self.load_tune)
  296.         self.load_button.grid(row=6, column=2)
  297.  
  298.     def set_values(self, output, max, min, side):
  299.         output.delete(0, tk.END)
  300.         output.insert(tk.END, self.equation(float(max.get()), float(min.get()), side))
  301.  
  302.     def show_help(self):
  303.         messagebox.showinfo('Help/Info', 'Examples:' + '\n' + '' + '\n' + 'Front: 0.54' + '\n' + 'Antiroll Bars: 65, 1' + '\n' + 'Springs: 1519.5, 218.8' + '\n' + 'Ride Height: 5.6, 3.0' + '\n' + 'Rebound: 20, 3' + '\n' + '' + '\n' + 'Created by: MilkyDoritos')
  304.  
  305.     def clear_text(self):
  306.         self.front_entry.delete(0, tk.END)
  307.         self.armax_entry.delete(0, tk.END)
  308.         self.armin_entry.delete(0, tk.END)
  309.         self.springmax_entry.delete(0, tk.END)
  310.         self.springmin_entry.delete(0, tk.END)
  311.         self.rideheightmax_entry.delete(0, tk.END)
  312.         self.rideheightmin_entry.delete(0, tk.END)
  313.         self.reboundmax_entry.delete(0, tk.END)
  314.         self.reboundmin_entry.delete(0, tk.END)
  315.  
  316.     def clear_output(self):
  317.         self.rear_output.delete(0, tk.END)
  318.         self.arfront_output.delete(0, tk.END)
  319.         self.arrear_output.delete(0, tk.END)
  320.         self.springfront_output.delete(0, tk.END)
  321.         self.springrear_output.delete(0, tk.END)
  322.         self.rideheightfront_output.delete(0, tk.END)
  323.         self.rideheightrear_output.delete(0, tk.END)
  324.         self.reboundfront_output.delete(0, tk.END)
  325.         self.reboundrear_output.delete(0, tk.END)
  326.         self.bumpfront_output.delete(0, tk.END)
  327.         self.bumprear_output.delete(0, tk.END)
  328.  
  329.     def save_tune(self):
  330.         try:
  331.             (float(self.rear_output.get()), float(self.arfront_output.get()), float(self.arrear_output.get()), float(self.springfront_output.get()), float(self.springrear_output.get()), float(self.rideheightfront_output.get()), float(self.rideheightrear_output.get()), float(self.reboundfront_output.get()), float(self.reboundrear_output.get()))
  332.         except ValueError:
  333.             messagebox.showerror('Cannot Save', 'Please have an avaliable tune/output ready to save')
  334.             return
  335.         self.tune_id = (db.insert(float(self.rear_output.get()), float(self.arfront_output.get()), float(self.arrear_output.get()), float(self.springfront_output.get()), float(self.springrear_output.get()), float(self.rideheightfront_output.get()), float(self.rideheightrear_output.get()), float(self.reboundfront_output.get()), float(self.reboundrear_output.get())))
  336.         self.save_entry.delete(0, tk.END)
  337.         self.save_entry.insert(tk.END, self.tune_id)
  338.  
  339.     def load_tune(self):
  340.         pass
  341.  
  342.     def select_item(self, event):
  343.         try:
  344.             index = self.tunes_list.curselection()[0]
  345.             self.selected_item = self.tunes_list.get(index)
  346.         except IndexError:
  347.             pass
  348.  
  349.     def populate_list(self):
  350.         self.tunes_list.delete(0, tk.END)
  351.         for row in db.fetch():
  352.             self.tunes_list.insert(tk.END, row)
  353.  
  354.     def remove_item(self):
  355.         db.remove(self.selected_item[0])
  356.         self.clear_text()
  357.         self.populate_list()
  358.  
  359. root = tk.Tk()
  360. app = Application(master=root)
  361. app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement