main.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from kivy.app import App
  2. from kivymd.app import MDApp # Импорт главного окна приложения
  3. from kivy.uix.boxlayout import BoxLayout # Импорт бокслояута для добавления в него виджетов
  4. from kivy.uix.spinner import Spinner # Импорт для выпадающего списка
  5. from kivymd.uix.datatables import MDDataTable # Импорт для таблицы
  6. from kivy.metrics import dp # Импорт для изменения размера
  7. from kivy.uix.scrollview import ScrollView # Импорт для прокрутки таблицы
  8. from kivymd.uix.textfield import MDTextField # Импорт для строки ввода
  9. from kivymd.uix.button import MDIconButton # Импорт для иконок кнопок
  10. from kivy.uix.image import Image # Импорт для изображения
  11. import json
  12. class SearchBoxLayout(BoxLayout):
  13. def __init__(self, **kwargs):
  14. super().__init__(**kwargs)
  15. self.orientation = 'vertical'
  16. self.padding = [50, 0, 50, 50]
  17. # Импорт фотографии
  18. self.image = Image(
  19. source='net.jpg',
  20. size_hint_y=0.3
  21. )
  22. self.add_widget(self.image)
  23. # Панель поиска и фильтрации
  24. search_filter_bar = BoxLayout(size_hint_y=None, height=dp(40), spacing=10)
  25. self.add_widget(search_filter_bar)
  26. # Строка поиска
  27. self.search_field = MDTextField(
  28. hint_text="Search...",
  29. size_hint_x=0.7
  30. )
  31. self.search_field.bind(text=self.filter_table)
  32. search_filter_bar.add_widget(self.search_field)
  33. # Кнопки фильтрации
  34. self.asc_button = MDIconButton(icon="arrow-up-drop-circle")
  35. self.asc_button.bind(on_release=self.sort_ascending)
  36. search_filter_bar.add_widget(self.asc_button)
  37. self.desc_button = MDIconButton(icon="arrow-down-drop-circle")
  38. self.desc_button.bind(on_release=self.sort_descending)
  39. search_filter_bar.add_widget(self.desc_button)
  40. # Выпадающий список для выбора машины
  41. self.spinner_car = Spinner(
  42. text='Выберите машину',
  43. 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'),
  44. size_hint=(None, None),
  45. size=(dp(200), dp(44)),
  46. pos_hint={'center_x': 0.5}
  47. )
  48. self.spinner_car.bind(text=self.filter_table_by_name)
  49. search_filter_bar.add_widget(self.spinner_car)
  50. # Выпадающий список для выбора ценового диапазона
  51. self.spinner_price = Spinner(
  52. text='Выберите цену',
  53. values=('10000 - 20000', '21000 - 30000', '31000 - 70000'),
  54. size_hint=(None, None),
  55. size=(dp(200), dp(44)),
  56. pos_hint={'center_x': 0.5}
  57. )
  58. self.spinner_price.bind(text=self.filter_table_by_price)
  59. search_filter_bar.add_widget(self.spinner_price)
  60. # Прокрутка для таблицы
  61. self.scrollview = ScrollView(size_hint_y=0.7)
  62. self.add_widget(self.scrollview)
  63. # Создание таблицы
  64. self.data_table = MDDataTable(
  65. size_hint=(1, 1),
  66. use_pagination=True,
  67. rows_num=10,
  68. column_data=[
  69. ("Название", dp(30)),
  70. ("Год", dp(15)),
  71. ("Цена", dp(15)),
  72. ("Цвет", dp(15)),
  73. ("Повреждения", dp(25)),
  74. ("Дата СТО", dp(30))
  75. ],
  76. # Инициализируем row_data пустым списком, данные будут загружены из JSON
  77. row_data=[]
  78. )
  79. self.scrollview.add_widget(self.data_table)
  80. # Загрузка данных из JSON файла
  81. self.load_data_from_json('package.json')
  82. def load_data_from_json(self, json_path):
  83. # Загрузка данных из JSON файла и обновление таблицы
  84. with open(json_path, 'r', encoding='utf-8') as json_file:
  85. data = json.load(json_file)
  86. # Предполагаем, что данные в JSON файле имеют формат списка словарей
  87. row_data = [(d['Название'], d['Год'], d['Цена'], d['Цвет'], d['Повреждения'], d['Дата СТО']) for d in data]
  88. self.data_table.row_data = row_data
  89. self.original_row_data = row_data
  90. self.original_row_data = self.data_table.row_data
  91. def filter_table(self, instance, text):
  92. # Фильтрация таблицы по поиску
  93. filtered_data = []
  94. for row in self.original_row_data:
  95. if text.lower() in row[0].lower():
  96. filtered_data.append(row)
  97. self.data_table.row_data = filtered_data
  98. def filter_table_by_name(self, spinner, text):
  99. # Фильтрация таблицы по названию машины
  100. if text != 'Выберите машину':
  101. filtered_data = [row for row in self.original_row_data if row[0] == text]
  102. self.data_table.row_data = filtered_data
  103. def filter_table_by_price(self, spinner, text):
  104. # Фильтрация таблицы по ценовому диапазону
  105. if text != 'Выберите цену':
  106. price_range = text.split(' - ')
  107. min_price, max_price = int(price_range[0]), int(price_range[1])
  108. filtered_data = [row for row in self.original_row_data if min_price <= int(row[2]) <= max_price]
  109. self.data_table.row_data = filtered_data
  110. def sort_ascending(self, instance):
  111. # Сортировка таблицы по цене в порядке возрастания
  112. self.data_table.row_data = sorted(self.original_row_data, key=lambda row: int(row[2]))
  113. def sort_descending(self, instance):
  114. # Сортировка таблицы по цене в порядке убывания
  115. self.data_table.row_data = sorted(self.original_row_data, key=lambda row: int(row[2]), reverse=True)
  116. class MyApp(MDApp):
  117. def build(self):
  118. return SearchBoxLayout()
  119. if __name__ == '__main__':
  120. MyApp().run()