123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- from kivy.app import App
- from kivymd.app import MDApp # Импорт главного окна приложения
- from kivy.uix.boxlayout import BoxLayout # Импорт бокслояута для добавления в него виджетов
- from kivy.uix.gridlayout import GridLayout # Импорт гридлояута для добавления элементов в виде сетки
- from kivy.uix.spinner import Spinner # Импорт для выпадающего списка
- from kivymd.uix.textfield import MDTextField # Импорт для таблицы
- from kivymd.uix.button import MDIconButton # Импорт для иконок кнопок
- from kivy.uix.image import Image # Импорт для изменения размера
- from kivy.uix.label import Label # Импорт Label для отображения текста
- from kivy.uix.scrollview import ScrollView # Импорт для прокрутки таблицы
- from kivy.metrics import dp # Импорт для изменения размера
- from kivy.utils import get_color_from_hex # Импорт для использования шестнадцатеричных цветовых кодов
- import json
- class CarItem(BoxLayout):
- def __init__(self, car_data, **kwargs):
- super().__init__(**kwargs)
- self.orientation = 'horizontal'
- self.size_hint_y = None
- self.height = dp(100)
- self.padding = [10, 10, 10, 10]
- self.image = Image(
- source=car_data.get('image'),
- size_hint_x=0.3,
- allow_stretch=True
- )
- self.add_widget(self.image)
- info_layout = BoxLayout(orientation='vertical')
- self.add_widget(info_layout)
- self.name_label = Label(text=car_data['Название'], font_size=18, color=get_color_from_hex('#000000'))
- info_layout.add_widget(self.name_label)
- self.price_label = Label(text=f"{car_data['Цена']} руб.", font_size=16, color=get_color_from_hex('#000000'))
- info_layout.add_widget(self.price_label)
- 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.5
- )
- self.search_field.bind(text=self.filter_items)
- 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=[],
- size_hint=(None, None),
- size=(dp(200), dp(44))
- )
- self.spinner_car.bind(text=self.filter_items)
- 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))
- )
- self.spinner_price.bind(text=self.filter_items)
- search_filter_bar.add_widget(self.spinner_price)
- # Прокрутка для таблицы
- self.scrollview = ScrollView()
- self.add_widget(self.scrollview)
- # Сетчатая разметка для хранения элементов автомобиля
- self.car_grid = GridLayout(cols=1, spacing=10, size_hint_y=None)
- self.car_grid.bind(minimum_height=self.car_grid.setter('height'))
- self.scrollview.add_widget(self.car_grid)
- # Загрузка данных из JSON
- self.car_data = self.load_data_from_json('package.json')
- self.original_car_data = self.car_data.copy()
- self.populate_car_grid()
- self.spinner_car.values = list({car['Название'] for car in self.car_data})
- def load_data_from_json(self, filename):
- with open(filename, 'r', encoding='utf-8') as f:
- data = json.load(f)
- return data
- def populate_car_grid(self):
- # Заполнение сетки виджетов
- self.car_grid.clear_widgets()
- for car in self.car_data:
- car_item = CarItem(car)
- self.car_grid.add_widget(car_item)
- def filter_items(self, instance, *args):
- # Сортировка по названию и цене
- filtered_data = self.original_car_data.copy()
- search_text = self.search_field.text.lower()
- filtered_data = [car for car in filtered_data if search_text in car['Название'].lower()]
- selected_car = self.spinner_car.text
- if selected_car != 'Выберите машину':
- filtered_data = [car for car in filtered_data if car['Название'] == selected_car]
- price_range = self.spinner_price.text
- if price_range != 'Выберите цену':
- min_price, max_price = map(int, price_range.split(' - '))
- filtered_data = [car for car in filtered_data if min_price <= int(car['Цена']) <= max_price]
- self.car_data = filtered_data
- self.populate_car_grid()
- def sort_ascending(self, instance):
- # Сортировка таблицы по цене в порядке возрастания
- self.car_data = sorted(self.car_data, key=lambda x: int(x['Цена']))
- self.populate_car_grid()
- def sort_descending(self, instance):
- # Сортировка таблицы по цене в порядке убывания
- self.car_data = sorted(self.car_data, key=lambda x: int(x['Цена']), reverse=True)
- self.populate_car_grid()
- class MyApp(MDApp):
- def build(self):
- return SearchBoxLayout()
- if __name__ == '__main__':
- MyApp().run()
|