valera пре 6 месеци
комит
f52c46910c
21 измењених фајлова са 638 додато и 0 уклоњено
  1. BIN
      au.jpg
  2. BIN
      b.jpg
  3. BIN
      bm.jpg
  4. BIN
      ca.jpg
  5. BIN
      img/1.png
  6. BIN
      img/2.png
  7. BIN
      img/3.png
  8. BIN
      img/4.png
  9. BIN
      img/5.png
  10. BIN
      img/6.png
  11. BIN
      img/7.png
  12. BIN
      ma.jpg
  13. 140 0
      main.py
  14. 155 0
      main2.py
  15. 93 0
      package.json
  16. 250 0
      readme.md
  17. BIN
      sil.jpg
  18. BIN
      sk.jpg
  19. BIN
      su.jpg
  20. BIN
      tr.jpg
  21. BIN
      tru.jpg












+ 140 - 0
main.py

@@ -0,0 +1,140 @@
+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()

+ 155 - 0
main2.py

@@ -0,0 +1,155 @@
+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()

+ 93 - 0
package.json

@@ -0,0 +1,93 @@
+[
+    {
+        "Название": "Toyota Trueno AE86",
+        "Год": 1995,
+        "Цена": 15000,
+        "Цвет": "white",
+        "Повреждения": "True",
+        "Дата СТО": "19/04/2024",
+        "image": "tru.jpg"
+    },
+    {
+        "Название": "Toyota Supra A80",
+        "Год": 1996,
+        "Цена": 30000,
+        "Цвет": "black",
+        "Повреждения": "False",
+        "Дата СТО": "09/02/2024",
+        "image": "su.jpg"
+    },
+    {
+        "Название": "Nissan Skyline R34",
+        "Год": 1996,
+        "Цена": 25000,
+        "Цвет": "orange",
+        "Повреждения": "False",
+        "Дата СТО": "10/07/2024",
+        "image": "sk.jpg"
+    },
+    {
+        "Название": "Nissan Silvia S15Nissan Silvia S15",
+        "Год": 1999,
+        "Цена": 20000,
+        "Цвет": "gray",
+        "Повреждения": "False",
+        "Дата СТО": "20/03/20244",
+        "image": "sil.jpg"
+    },
+    {
+        "Название": "Toyota Camry 3.5",
+        "Год": 2020,
+        "Цена": 20000,
+        "Цвет": "blue",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "ca.jpg"
+    },
+    {
+        "Название": "Audi RS 6",
+        "Год": 2016,
+        "Цена": 30000,
+        "Цвет": "lightblue",
+        "Повреждения": "True",
+        "Дата СТО": "10/07/2024",
+        "image": "au.jpg"
+    },
+    {
+        "Название": "Трактор LOVOL TE354 HT",
+        "Год": 2024,
+        "Цена": 66666,
+        "Цвет": "brown",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "tr.jpg"
+    },
+    {
+        "Название": "BMW M5 F90",
+        "Год": 2019,
+        "Цена": 30000,
+        "Цвет": "black",
+        "Повреждения": "True",
+        "Дата СТО": "20/03/20244",
+        "image": "b.jpg"
+    },
+    {
+        "Название": "BMW E36",
+        "Год": 2006,
+        "Цена": 35000,
+        "Цвет": "red",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "bm.jpg"
+    },
+    {
+        "Название": "Daewoo Matiz",
+        "Год": 2010,
+        "Цена": 20000,
+        "Цвет": "pink",
+        "Повреждения": "True",
+        "Дата СТО": "10/07/2024",
+        "image": "ma.jpg"
+    }
+]
+

+ 250 - 0
readme.md

@@ -0,0 +1,250 @@
+**["Задание на автомат"]()**
+***
+**Python (Kivy/KivyMD)**
+***
+**main.py**
+***
+```
+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()
+```
+***
+**json**
+***
+```
+[
+    {
+        "Название": "Toyota Trueno AE86",
+        "Год": 1995,
+        "Цена": 15000,
+        "Цвет": "white",
+        "Повреждения": "True",
+        "Дата СТО": "19/04/2024",
+        "image": "tru.jpg"
+    },
+    {
+        "Название": "Toyota Supra A80",
+        "Год": 1996,
+        "Цена": 30000,
+        "Цвет": "black",
+        "Повреждения": "False",
+        "Дата СТО": "09/02/2024",
+        "image": "su.jpg"
+    },
+    {
+        "Название": "Nissan Skyline R34",
+        "Год": 1996,
+        "Цена": 25000,
+        "Цвет": "orange",
+        "Повреждения": "False",
+        "Дата СТО": "10/07/2024",
+        "image": "sk.jpg"
+    },
+    {
+        "Название": "Nissan Silvia S15Nissan Silvia S15",
+        "Год": 1999,
+        "Цена": 20000,
+        "Цвет": "gray",
+        "Повреждения": "False",
+        "Дата СТО": "20/03/20244",
+        "image": "sil.jpg"
+    },
+    {
+        "Название": "Toyota Camry 3.5",
+        "Год": 2020,
+        "Цена": 20000,
+        "Цвет": "blue",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "ca.jpg"
+    },
+    {
+        "Название": "Audi RS 6",
+        "Год": 2016,
+        "Цена": 30000,
+        "Цвет": "lightblue",
+        "Повреждения": "True",
+        "Дата СТО": "10/07/2024",
+        "image": "au.jpg"
+    },
+    {
+        "Название": "Трактор LOVOL TE354 HT",
+        "Год": 2024,
+        "Цена": 66666,
+        "Цвет": "brown",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "tr.jpg"
+    },
+    {
+        "Название": "BMW M5 F90",
+        "Год": 2019,
+        "Цена": 30000,
+        "Цвет": "black",
+        "Повреждения": "True",
+        "Дата СТО": "20/03/20244",
+        "image": "b.jpg"
+    },
+    {
+        "Название": "BMW E36",
+        "Год": 2006,
+        "Цена": 35000,
+        "Цвет": "red",
+        "Повреждения": "False",
+        "Дата СТО": "19/04/2024",
+        "image": "bm.jpg"
+    },
+    {
+        "Название": "Daewoo Matiz",
+        "Год": 2010,
+        "Цена": 20000,
+        "Цвет": "pink",
+        "Повреждения": "True",
+        "Дата СТО": "10/07/2024",
+        "image": "ma.jpg"
+    }
+]
+```
+![](./img/1.png)
+![](./img/2.png)
+![](./img/3.png)
+![](./img/4.png)
+![](./img/5.png)