123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- from kivy.app import App
- from kivymd.app import MDApp # Импорт главного окна приложения
- from kivy.uix.boxlayout import BoxLayout # Импорт бокслояута для добавления в него виджетов
- from kivy.uix.spinner import Spinner # Импорт для выпадающего списка
- from kivymd.uix.datatables import MDDataTable # Импорт для таблицы
- from kivy.metrics import dp # Импорт для изменения размера
- from kivy.uix.scrollview import ScrollView # Импорт для прокрутки таблицы
- from kivymd.uix.textfield import MDTextField # Импорт для строки ввода
- from kivymd.uix.button import MDIconButton # Импорт для иконок кнопок
- from kivy.uix.image import Image # Импорт для изображения
- import json
- class SearchBoxLayout(BoxLayout):
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- self.orientation = 'vertical'
- self.padding = [50, 0, 50, 50]
- # Импорт фотографии
- self.image = Image(
- source='net.jpg',
- size_hint_y=0.3
- )
- self.add_widget(self.image)
- # Панель поиска и фильтрации
- search_filter_bar = BoxLayout(size_hint_y=None, height=dp(40), spacing=10)
- self.add_widget(search_filter_bar)
- # Строка поиска
- self.search_field = MDTextField(
- hint_text="Search...",
- size_hint_x=0.7
- )
- self.search_field.bind(text=self.filter_table)
- search_filter_bar.add_widget(self.search_field)
- # Кнопки фильтрации
- self.asc_button = MDIconButton(icon="arrow-up-drop-circle")
- self.asc_button.bind(on_release=self.sort_ascending)
- search_filter_bar.add_widget(self.asc_button)
- self.desc_button = MDIconButton(icon="arrow-down-drop-circle")
- self.desc_button.bind(on_release=self.sort_descending)
- search_filter_bar.add_widget(self.desc_button)
- # Выпадающий список для выбора машины
- self.spinner_car = Spinner(
- text='Выберите машину',
- values=('Toyota Trueno AE86', 'Toyota Supra A80', 'Nissan Skyline R34', 'Nissan Silvia S15', 'Toyota Camry 3.5', 'Audi RS 6', 'Трактор LOVOL TE354 HT', 'BMW M5 F90', 'BMW E36', 'Daewoo Matiz'),
- size_hint=(None, None),
- size=(dp(200), dp(44)),
- pos_hint={'center_x': 0.5}
- )
- self.spinner_car.bind(text=self.filter_table_by_name)
- search_filter_bar.add_widget(self.spinner_car)
- # Выпадающий список для выбора ценового диапазона
- self.spinner_price = Spinner(
- text='Выберите цену',
- values=('10000 - 20000', '21000 - 30000', '31000 - 70000'),
- size_hint=(None, None),
- size=(dp(200), dp(44)),
- pos_hint={'center_x': 0.5}
- )
- self.spinner_price.bind(text=self.filter_table_by_price)
- search_filter_bar.add_widget(self.spinner_price)
- # Прокрутка для таблицы
- self.scrollview = ScrollView(size_hint_y=0.7)
- self.add_widget(self.scrollview)
- # Создание таблицы
- self.data_table = MDDataTable(
- size_hint=(1, 1),
- use_pagination=True,
- rows_num=10,
- column_data=[
- ("Название", dp(30)),
- ("Год", dp(15)),
- ("Цена", dp(15)),
- ("Цвет", dp(15)),
- ("Повреждения", dp(25)),
- ("Дата СТО", dp(30))
- ],
- # Инициализируем row_data пустым списком, данные будут загружены из JSON
- row_data=[]
- )
- self.scrollview.add_widget(self.data_table)
- # Загрузка данных из JSON файла
- self.load_data_from_json('package.json')
- def load_data_from_json(self, json_path):
- # Загрузка данных из JSON файла и обновление таблицы
- with open(json_path, 'r', encoding='utf-8') as json_file:
- data = json.load(json_file)
- # Предполагаем, что данные в JSON файле имеют формат списка словарей
- row_data = [(d['Название'], d['Год'], d['Цена'], d['Цвет'], d['Повреждения'], d['Дата СТО']) for d in data]
- self.data_table.row_data = row_data
- self.original_row_data = row_data
- self.original_row_data = self.data_table.row_data
- def filter_table(self, instance, text):
- # Фильтрация таблицы по поиску
- filtered_data = []
- for row in self.original_row_data:
- if text.lower() in row[0].lower():
- filtered_data.append(row)
- self.data_table.row_data = filtered_data
- def filter_table_by_name(self, spinner, text):
- # Фильтрация таблицы по названию машины
- if text != 'Выберите машину':
- filtered_data = [row for row in self.original_row_data if row[0] == text]
- self.data_table.row_data = filtered_data
- def filter_table_by_price(self, spinner, text):
- # Фильтрация таблицы по ценовому диапазону
- if text != 'Выберите цену':
- price_range = text.split(' - ')
- min_price, max_price = int(price_range[0]), int(price_range[1])
- filtered_data = [row for row in self.original_row_data if min_price <= int(row[2]) <= max_price]
- self.data_table.row_data = filtered_data
- def sort_ascending(self, instance):
- # Сортировка таблицы по цене в порядке возрастания
- self.data_table.row_data = sorted(self.original_row_data, key=lambda row: int(row[2]))
- def sort_descending(self, instance):
- # Сортировка таблицы по цене в порядке убывания
- self.data_table.row_data = sorted(self.original_row_data, key=lambda row: int(row[2]), reverse=True)
- class MyApp(MDApp):
- def build(self):
- return SearchBoxLayout()
- if __name__ == '__main__':
- MyApp().run()
|