Ошибка -- line 129, in update_table car = self.car_controller.select_client(row[-1])[0] IndexError: list index out of range

from Database.database_class import DB
import tkinter as tk
from Utils.table import TableClass
from tkinter import messagebox
import datetime

from Clients.Clients import ClientController
from Directions.directions import DirectionController


OPTION = {'family': 'verdana', 'size': 12, 'weight': 'bold', 'width': 22}


class TripsController(DB):
    def insert_trip(self, day_quantity, purpose_of_trip, way_to_tip, client_full_name,):
        sql = '''INSERT INTO trips
                (day_quantity, purpose_of_trip, way_to_tip, client_full_name, )
                VALUES(?, ?, ?, ?)'''
        value = (day_quantity, purpose_of_trip, way_to_tip, client_full_name,)
        self._execute_query(sql, value)

    def delete_trip(self, trip_id):
        sql = 'DELETE FROM trips WHERE id=?'
        value = (trip_id,)
        self._execute_query(sql, value)

    def update_trip(self, day_quantity, purpose_of_trip, way_to_tip, client_full_name, trip_id):
        sql = '''UPDATE trips
                 SET day_quantity = ?, 
                 purpose_of_trip = ?, 
                 way_to_tip = ?, 
                 client_full_name = ?, 
                 WHERE id = ?'''
        value = (day_quantity, purpose_of_trip, way_to_tip, client_full_name, trip_id)
        self._execute_query(sql, value)

    def select_trips(self):
        sql = '''SELECT * FROM trips'''
        return self._execute_select_query(sql)


    def select_trip(self, trip_id):
        sql = '''SELECT * FROM acts_of_violations WHERE id=?'''
        value = (trip_id, )
        return self._execute_select_query(sql, value)


class TripApplication(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        self.client_controller = ClientController()
        self.direction_controller = DirectionController()
        self.trips_controller = TripsController()
        self.trips = list()
        self.app = None

        label = tk.Label(self, text="This is Violation Act application", font=controller.title_font)
        label.grid(row=0, column=0, columnspan=5)

        self.table = TableClass(parent=self,
                                hidden_columns=('ID', 'CarID', 'ViolationID'),
                                headings=('Car', 'Violation', 'date', 'fine amount', 'driver'),
                                grid={'row': 1, 'column': 0, 'columnspan': 4})
        self.update_table()

        add_button = tk.Button(self, text="Add act",
                               command=self.add_frame, width=OPTION['width'])
        add_button.grid(row=2, column=0)

        update_button = tk.Button(self, text="Update act",
                                  command=self.update_frame, width=OPTION['width'])
        update_button.grid(row=2, column=1)

        delete_button = tk.Button(self, text="Delete act",
                                  command=self.delete_frame, width=OPTION['width'])
        delete_button.grid(row=2, column=2)

        exit_button = tk.Button(self, text="Go to the start page",
                                command=lambda: controller.show_frame("StartPage"), width=OPTION['width'])
        exit_button.grid(row=2, column=3)

    def add_frame(self):
        if self.app:
            self.app.master.destroy()
        if len(self.client_controller.select_clients()) == 0 or len(self.direction_controller.select_directions()) == 0:
            messagebox.showerror('Empty set', 'Set of cars or violation types is empty')
        else:
            add_window = tk.Toplevel(self.master)
            self.app = AddFrame(add_window, base_frame=self)

    def update_frame(self):
        if self.app:
            self.app.master.destroy()
        try:
            row = self.table.get_selected_item()
            trip = self.find_trip(row)
            update_window = tk.Toplevel(self.master)
            self.app = UpdateFrame(update_window, trip = trip, base_frame=self)
        except IndexError as e:
            print(e)
            messagebox.showerror('Select someone', 'Select someone')
        except StopIteration:
            messagebox.showerror('Nothing to select', 'Nothing to select')

    def delete_frame(self):
        if self.app:
            self.app.master.destroy()
        try:
            row = self.table.get_selected_item()
            trip = self.find_trip(row)
            delete_window = tk.Toplevel(self.master)
            self.app = DeleteFrame(delete_window, trip = trip, base_frame=self)
        except IndexError as e:
            print(e)
            messagebox.showerror('Select someone', 'Select someone')
        except StopIteration:
            messagebox.showerror('Nothing to select', 'Nothing to select')

    def find_trip(self, row):
        trip = self.trips_controller.select_trip(row[0])[0]
        return trip

    def update_table(self):
        self.acts = self.trips_controller.select_trips()
        rows = self.acts
        for i, row in enumerate(rows):
            client = self.client_controller.select_client(row[-1])[0]
            string = [str(e) for e in client[1:]]
            client_str = ' '.join(string)
            direction = self.direction_controller.select_direction(row[-2])
            rows[i] = (row[0], row[-2], row[-1], client_str, direction[0][1], row[2], row[1], row[3])
        self.table.update_table(rows)


class FieldsFrame:
    def __init__(self, master, base_frame):
        self.master = master
        self.base_frame = base_frame
        self.controller = TripsController()
        self.client_controller = ClientController()
        self.direction_controller = DirectionController()

        self._init_labels()
        self._init_entries()

        quit_button = tk.Button(self.master, text='Quit', width=25, command=self.close_windows)
        quit_button.grid(row=self.last_row, column=0)

    def _init_labels(self):
        row, column = 0, 0

        day_quantity = tk.Label(master=self.master, text='Fine amount: ')
        day_quantity.grid(row=row, column=column)
        row += 1

        purpose_of_trip = tk.Label(master=self.master, text='Full name of driver: ')
        purpose_of_trip.grid(row=row, column=column)
        row += 1

        client_full_name = tk.Label(master=self.master, text='Violation car: ')
        client_full_name.grid(row=row, column=column)
        row += 1

        way_to_tip = tk.Label(master=self.master, text='Violation type: ')
        way_to_tip.grid(row=row, column=column)
        row += 1

    def _init_entries(self):
        row, column = 0, 1
        self.entry_day_quantity = tk.Entry(master=self.master)
        self.entry_day_quantity.grid(row=row, column=column)
        row += 1

        self.entry_purpose_of_trip = tk.Entry(master=self.master)
        self.entry_purpose_of_trip.grid(row=row, column=column)
        row += 1

        self._init_client_drop_menu(row, column)
        row += 1

        self._init_direction_drop_menu(row, column)
        row += 1

        self.last_row = row

    def _init_direction_drop_menu(self, row, column):
        self.direction_var = tk.StringVar(self.master)
        self.direction_var.set('Select from the list')

        directions = self.direction_controller.select_directions()
        self.direction_choices = list()
        for n, v in enumerate(directions, start=1):
            self.direction_choices.append((n, v[1]))

        self.entry_way_to_tip = tk.OptionMenu(self.master, self.direction_var, *self.direction_choices)
        self.entry_way_to_tip.grid(row=row, column=column)
        self.entry_way_to_tip_value = None
        self.direction_var.trace('w', self.change_dropdown_direction)

    def change_dropdown_direction(self, *args):
        self.entry_way_to_tip_value = self.direction_var.get()
        print('violation', self.entry_way_to_tip_value)

    def _init_client_drop_menu(self, row, column):
        self.client_var = tk.StringVar(self.master)
        self.client_var.set('Select from the list')

        clients = self.client_controller.select_clients()
        self.client_choices = list()
        for n, c in enumerate(clients, start=1):
            string = [str(e) for e in c[1:]]
            client_str = ' '.join(string)
            self.client_choices.append((n, str(client_str)))

        self.entry_client_full_name = tk.OptionMenu(self.master, self.client_var, *self.client_choices)
        self.entry_client_full_name.grid(row=row, column=column)
        self.entry_client_full_name_value = None
        self.client_var.trace('w', self.change_dropdown_client)

    def change_dropdown_client(self, *args):
        self.entry_client_full_name_value = self.client_var.get()
        print('car', self.entry_client_full_name_value)

    def get_trip_data(self):
        while True:
            try:
                day_quantity = int(self.entry_day_quantity.get())
                if day_quantity <= 0:
                    raise ValueError

                purpose_of_trip = self.entry_purpose_of_trip.get()
                if purpose_of_trip is None or len(purpose_of_trip) == 0:
                    raise ValueError

                number_way_to_tip = int(self.entry_way_to_tip_value[1:-1].split(',')[0])
                number_client_full_name = int(self.entry_client_full_name_value[1:-1].split(',')[0])

                way_to_tip = self.direction_controller.select_directions()[number_way_to_tip - 1][0]
                client_full_name = self.client_controller.select_clients()[number_client_full_name - 1][0]
            except (ValueError, TypeError):
                error_str = '\tfine amount - text\n' + \
                            '\tdriver full name - text\n' + \
                            '\tdate of violation - date\n' + \
                            '\ttype of violation - selected type of violation\n' + \
                            '\tcar of violation - selected car of violation\n'
                messagebox.showerror('Enter correct data', error_str)
                return

            return day_quantity, purpose_of_trip, way_to_tip, client_full_name

    def close_windows(self):
        self.master.destroy()


class AddFrame(FieldsFrame):
    def __init__(self, master, base_frame):
        super().__init__(master, base_frame)
        self.master = master
        self.frame = tk.Frame(self.master)

        self.frame.grid(row=0, column=0)
        save_button = tk.Button(self.master, text='Save', width=25, command=self.save)
        save_button.grid(row=self.last_row, column=1)

    def save(self):
        self.controller.insert_trip(*self.get_trip_data())
        self.base_frame.update_table()
        self.close_windows()
        print('--- Act was successfully added ---')


class UpdateFrame(FieldsFrame):
    def __init__(self, master, base_frame, trip):
        super().__init__(master, base_frame)
        self.master = master
        self.trip = trip
        self.frame = tk.Frame(self.master)

        self._init_initial_trip()

        self.frame.grid(row=0, column=0)
        update_button = tk.Button(self.master, text='Update', width=25, command=self.update)
        update_button.grid(row=self.last_row, column=1)

    def _init_initial_trip(self):
        self.entry_day_quantity.insert(0, self.trip[1])
        self.entry_purpose_of_trip.insert(0, self.trip[3])
        date = self.trip[2].split('-')
        date = '-'.join(date[::-1])

        self.client_var.set(self.client_choices[self.trip[-1] - 1])
        self.entry_client_full_name_value = self.client_var.get()

        self.direction_var.set(self.direction_choices[self.trip[-2] - 1])
        self.entry_way_to_tip_value = self.direction_var.get()

    def update(self):
        trip = self.get_trip_data()
        self.controller.update_trip(*trip, self.trip[0])
        self.base_frame.update_table()
        self.close_windows()
        print('--- Act was successfully updated ---')


class DeleteFrame(FieldsFrame):
    def __init__(self, master, base_frame, trip):
        super().__init__(master, base_frame)
        self.master = master
        self.trip = trip
        self.frame = tk.Frame(self.master)

        self._init_initial_trip()

        self.frame.grid(row=0, column=0)
        delete_button = tk.Button(self.master, text='Delete', width=25, command=self.delete)
        delete_button.grid(row=self.last_row, column=1)

    def _init_initial_trip(self):
        self.entry_day_quantity.insert(0, self.trip[1])
        self.entry_purpose_of_trip.insert(0, self.trip[3])
        date = self.trip[2].split('-')
        date = '-'.join(date[::-1])

        self.client_var.set(self.client_choices[self.trip[-1] - 1])
        self.entry_client_full_name_value = self.client_var.get()

        self.direction_var.set(self.direction_choices[self.trip[-2] - 1])
        self.entry_way_to_tip_value = self.direction_var.get()

        self.entry_day_quantity.config(state=tk.DISABLED)
        self.entry_purpose_of_trip.config(state=tk.DISABLED)
        self.entry_client_full_name.config(state=tk.DISABLED)
        self.entry_way_to_tip.config(state=tk.DISABLED)

    def delete(self):
        self.controller.delete_trip(self.trip[0])
        self.base_frame.update_table()
        self.close_windows()

Ответы (0 шт):