main2.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from kivy.app import App
  2. from kivymd.app import MDApp # Импорт главного окна приложения
  3. from kivy.uix.boxlayout import BoxLayout # Импорт бокслояута для добавления в него виджетов
  4. from kivy.uix.gridlayout import GridLayout # Импорт гридлояута для добавления элементов в виде сетки
  5. from kivy.uix.spinner import Spinner # Импорт для выпадающего списка
  6. from kivymd.uix.textfield import MDTextField # Импорт для таблицы
  7. from kivymd.uix.button import MDIconButton # Импорт для иконок кнопок
  8. from kivy.uix.image import Image # Импорт для изменения размера
  9. from kivy.uix.label import Label # Импорт Label для отображения текста
  10. from kivy.uix.scrollview import ScrollView # Импорт для прокрутки таблицы
  11. from kivy.metrics import dp # Импорт для изменения размера
  12. from kivy.utils import get_color_from_hex # Импорт для использования шестнадцатеричных цветовых кодов
  13. import json
  14. class CarItem(BoxLayout):
  15. def __init__(self, car_data, **kwargs):
  16. super().__init__(**kwargs)
  17. self.orientation = 'horizontal'
  18. self.size_hint_y = None
  19. self.height = dp(100)
  20. self.padding = [10, 10, 10, 10]
  21. self.image = Image(
  22. source=car_data.get('image'),
  23. size_hint_x=0.3,
  24. allow_stretch=True
  25. )
  26. self.add_widget(self.image)
  27. info_layout = BoxLayout(orientation='vertical')
  28. self.add_widget(info_layout)
  29. self.name_label = Label(text=car_data['Название'], font_size=18, color=get_color_from_hex('#000000'))
  30. info_layout.add_widget(self.name_label)
  31. self.price_label = Label(text=f"{car_data['Цена']} руб.", font_size=16, color=get_color_from_hex('#000000'))
  32. info_layout.add_widget(self.price_label)
  33. class SearchBoxLayout(BoxLayout):
  34. def __init__(self, **kwargs):
  35. super().__init__(**kwargs)
  36. self.orientation = 'vertical'
  37. self.padding = [50, 0, 50, 50]
  38. # Импорт фотографии
  39. self.image = Image(
  40. source='net.jpg',
  41. size_hint_y=0.3
  42. )
  43. self.add_widget(self.image)
  44. # Панель поиска и фильтрации
  45. search_filter_bar = BoxLayout(size_hint_y=None, height=dp(40), spacing=10)
  46. self.add_widget(search_filter_bar)
  47. # Строка поиска
  48. self.search_field = MDTextField(
  49. hint_text="Search...",
  50. size_hint_x=0.5
  51. )
  52. self.search_field.bind(text=self.filter_items)
  53. search_filter_bar.add_widget(self.search_field)
  54. # Кнопки фильтрации
  55. self.asc_button = MDIconButton(icon="arrow-up-drop-circle")
  56. self.asc_button.bind(on_release=self.sort_ascending)
  57. search_filter_bar.add_widget(self.asc_button)
  58. self.desc_button = MDIconButton(icon="arrow-down-drop-circle")
  59. self.desc_button.bind(on_release=self.sort_descending)
  60. search_filter_bar.add_widget(self.desc_button)
  61. # Выпадающий список для выбора машины
  62. self.spinner_car = Spinner(
  63. text='Выберите машину',
  64. values=[],
  65. size_hint=(None, None),
  66. size=(dp(200), dp(44))
  67. )
  68. self.spinner_car.bind(text=self.filter_items)
  69. search_filter_bar.add_widget(self.spinner_car)
  70. # Выпадающий список для выбора ценового диапазона
  71. self.spinner_price = Spinner(
  72. text='Выберите цену',
  73. values=('10000 - 20000', '21000 - 30000', '31000 - 70000'),
  74. size_hint=(None, None),
  75. size=(dp(200), dp(44))
  76. )
  77. self.spinner_price.bind(text=self.filter_items)
  78. search_filter_bar.add_widget(self.spinner_price)
  79. # Прокрутка для таблицы
  80. self.scrollview = ScrollView()
  81. self.add_widget(self.scrollview)
  82. # Сетчатая разметка для хранения элементов автомобиля
  83. self.car_grid = GridLayout(cols=1, spacing=10, size_hint_y=None)
  84. self.car_grid.bind(minimum_height=self.car_grid.setter('height'))
  85. self.scrollview.add_widget(self.car_grid)
  86. # Загрузка данных из JSON
  87. self.car_data = self.load_data_from_json('package.json')
  88. self.original_car_data = self.car_data.copy()
  89. self.populate_car_grid()
  90. self.spinner_car.values = list({car['Название'] for car in self.car_data})
  91. def load_data_from_json(self, filename):
  92. with open(filename, 'r', encoding='utf-8') as f:
  93. data = json.load(f)
  94. return data
  95. def populate_car_grid(self):
  96. # Заполнение сетки виджетов
  97. self.car_grid.clear_widgets()
  98. for car in self.car_data:
  99. car_item = CarItem(car)
  100. self.car_grid.add_widget(car_item)
  101. def filter_items(self, instance, *args):
  102. # Сортировка по названию и цене
  103. filtered_data = self.original_car_data.copy()
  104. search_text = self.search_field.text.lower()
  105. filtered_data = [car for car in filtered_data if search_text in car['Название'].lower()]
  106. selected_car = self.spinner_car.text
  107. if selected_car != 'Выберите машину':
  108. filtered_data = [car for car in filtered_data if car['Название'] == selected_car]
  109. price_range = self.spinner_price.text
  110. if price_range != 'Выберите цену':
  111. min_price, max_price = map(int, price_range.split(' - '))
  112. filtered_data = [car for car in filtered_data if min_price <= int(car['Цена']) <= max_price]
  113. self.car_data = filtered_data
  114. self.populate_car_grid()
  115. def sort_ascending(self, instance):
  116. # Сортировка таблицы по цене в порядке возрастания
  117. self.car_data = sorted(self.car_data, key=lambda x: int(x['Цена']))
  118. self.populate_car_grid()
  119. def sort_descending(self, instance):
  120. # Сортировка таблицы по цене в порядке убывания
  121. self.car_data = sorted(self.car_data, key=lambda x: int(x['Цена']), reverse=True)
  122. self.populate_car_grid()
  123. class MyApp(MDApp):
  124. def build(self):
  125. return SearchBoxLayout()
  126. if __name__ == '__main__':
  127. MyApp().run()