GUI do programu CRUD cz.2

We wcześniejszym wpisie utworzyłem główne okno aplikacji. Następnie uzupełnię metody, które obsługują zdarzenia inicjowane przez elementy interfejsu.

Najpierw uzupełnię metodę show_cars(), która jest aktywowana po wczytaniu widgetów do okna głównego jak również każdorazowo np. po dodaniu lub usunięciu auta z bazy.

    def show_cars(self):
        all_cars = self.helper.show_all_cars()
        self.car_tview.delete(*self.car_tview.get_children())
        for i, car in enumerate(all_cars, start=1):
            car = list(car)
            car.insert(0, i)
            self.car_tview.insert('', 'end', values=car)

Na początku uruchamiana jest metoda show_all_cars() klasy Helper. Zwraca ona wszystkie auta z bazy danych w postaci listy krotek. Następnie usuwane są wszystkie elementy widżetu TreeView, aby wczytać ponownie listę aut po zmianach. Do każdego elementu dodawana jest liczba porządkowa.

Aby ułatwić obsługę metod del_car(), sell_car(), show_repairs() wyodrębnię prywatną metodę: __get_car_from_selection(), która zwraca instancję klasy Car na podstawie zaznaczonego wiersza tzn.

    def __get_car_from_selection(self):
        selected_item = self.car_tview.focus()
        if selected_item == '':
            messagebox.showinfo('Information', 'No item selected')
        else:
            selection_dict = self.car_tview.item(selected_item)
            selection = selection_dict.get('values')
            i, *args = selection
            car = Car.from_list(args)
            return car

Na początku w powyższej metodzie sprawdzane jest, czy zaznaczony jest jakiś wiersz zawierający dane o samochodzie. Jeśli tak, to zwracany jest element obiektu TreeView w formie słownika. Dane o wybranym aucie obecne są jako wartość dla klucza ‘values’. Z listy usuwany jest pierwszy element, będący liczbą porządkową wiersza. Tak zmodyfikowana lista jest argumentem metody from_list() klasy Car.

Kod metody del_car():

    def del_car(self):
        car = self.__get_car_from_selection()
        if car and messagebox.askyesno('Delete', 'Delete selected car?'):
            self.helper.del_car(car)
            self.show_cars()

W powyższej metodzie sprawdzane jest, czy zmienna car nie jest typu None i czy również użytkownik potwierdził w oknie dialogowym usuwanie danych o aucie. Jeśli oba te warunki są spełnione to zostaje uruchomiona metoda klasy Helper kasująca auto z bazy danych. Następnie uaktualniane są wpisy o autach w bazie danych za pomocą metody show_cars() klasy CarManager.

Kod metody sell_car():

    def sell_car(self):
        car = self.__get_car_from_selection()
        if car and car.sold:
            messagebox.showinfo('Information', 'Already marked as sold')
        elif car and messagebox.askyesno('Sell', 'Mark car as sold?'):
            self.helper.set_sold(car)
            self.show_cars()

W powyższej metodzie sprawdzane jest czy auto nie zostało już wcześniej oznaczone jako sprzedane. Jeśli nie to wyświetlony zostaje okno dialogowe w celu potwierdzenia. Jeśli użytkownik zaakceptuje, to wywoływana jest metoda set_sold() klasy Helper a następnie metoda show_cars() obiektu CarManager.

Kod metody show_repairs():

    def show_repairs(self):
        car = self.__get_car_from_selection()
        if car:
            repairs = RepairsWindow(self.root, car)

W metodzie show_repairs(), gdy zmienna car nie jest typu None zostaje utworzone nowe okno potomne, które opisuje klasa RepairsWindow.

Ostatnią opisaną w tym wpisie metodą jest metoda add_car(), która jest aktywowana po naciśnięciu przycisku add_car_button.

def add_car(self):
        add_car = NewCarWindow(self.root, self)

W metodzie add_car() zostaje utworzone nowe okno potomne, które opisuje klasa NewCarWindow.

Kody obu klas opiszę w kolejnym wpisie.

Dopisania wymagają jeszcze metody dowiązane do pola wprowadzania search_entry tzn. on_entry_in(), on_entry_out() i on_entry_return(), tzn.

    def on_entry_in(self, event):
        self.search_entry.config(fg='black')
        self.search_variable.set('')

    def on_entry_out(self, event):
        self.search_entry.config(fg='grey')
        self.search_variable.set('Search car by VRN')

Uzyskanie focusa przez pole wyszukiwania search_entry powoduje wyczyszczenie pola wyszukiwania i zmianę koloru czcionki. Strata focusa powoduje wypisanie w polu search_entry szarego napisu ‘Search car by VRN’.

def on_entry_return(self, event):
    vrn = self.search_variable.get()
    if vrn == '':
        self.show_cars()
    else:
        car = self.helper.search_by_vrn(vrn)
        self.car_tview.delete(*self.car_tview.get_children())
        if car:
            car = list(car)
            car.insert(0, 1)
            self.car_tview.insert('', 'end', values=car)

Powyższy kod metody on_entry_return sprawdza, czy po naciśnięciu klawisza Enter pole wyszukiwania jest puste. Jeśli tak, to wyświetlane są dane o wszystkich dostępnych autach z bazy. Jeśli w polu wyszukiwania jest wpisana jakaś fraza, to zostaje uruchomiona metoda search_by_vrn() klasy Helper, a następnie uaktualniona zawartość widżetu car_tview, wyświetlająca wyniki wyszukiwania.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *