Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # для логов
- import datetime
- import inspect
- # для самой программы
- from kivy.app import App
- from kivy.uix.anchorlayout import AnchorLayout
- from kivy.uix.boxlayout import BoxLayout
- from kivy.uix.textinput import TextInput
- from kivy.uix.dropdown import DropDown
- from kivy.uix.button import Button
- from kivy.uix.scrollview import ScrollView
- from kivy.uix.label import Label
- from kivy.properties import ListProperty
- from kivy.clock import Clock
- # проверка
- def log_var(var_name, var_value, log_file="test4.log", func_name=None):
- """
- Записывает в лог-файл название переменной, её значение и имя функции
- :param var_name: название переменной (строка)
- :param var_value: значение переменной
- :param log_file: путь к лог-файлу (по умолчанию test4.log)
- :param func_name: имя функции (если None, будет определено автоматически)
- """
- timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- # Если имя функции не указано, пытаемся определить автоматически
- if func_name is None:
- try:
- # Получаем имя вызывающей функции (2 уровня выше в стеке вызовов)
- func_name = inspect.currentframe().f_back.f_back.f_code.co_name
- except:
- func_name = "unknown"
- log_message = f"[{timestamp}] [{func_name}] {var_name} = {repr(var_value)}\n"
- with open(log_file, "a", encoding="utf-8") as f:
- f.write(log_message)
- class SearchBox(BoxLayout):
- suggestions = ListProperty([])
- def __init__(self, **kwargs):
- super(SearchBox, self).__init__(**kwargs)
- self.orientation = 'vertical'
- # Контейнер для поля поиска
- search_container = AnchorLayout(
- anchor_x='center',
- anchor_y='top',
- size_hint=(1, None),
- height=40
- )
- self.search_input = TextInput(
- hint_text='Введите поисковый запрос...',
- size_hint=(1, None),
- height=40
- )
- self.search_input.bind(text=self.on_text)
- search_container.add_widget(self.search_input)
- self.add_widget(search_container)
- # Выпадающий список (без ограничений)
- self.dropdown = DropDown()
- self.dropdown.bind(on_select=lambda i, x: (
- setattr(self.search_input, 'text', x),
- self.update_search_results(x)
- ))
- # Область результатов
- self.scroll = ScrollView(size_hint=(1, 1))
- self.add_widget(self.scroll)
- self.results_layout = BoxLayout(
- orientation='vertical',
- size_hint_y=None,
- )
- self.results_layout.bind(minimum_height=self.results_layout.setter('height'))
- self.scroll.add_widget(self.results_layout)
- self.all_data = [
- "Python программирование",
- "Kivy разработка приложений",
- "Android приложения на Python",
- "Изучение Kivy для начинающих",
- "Примеры Kivy приложений",
- "Работа с базами данных в Python",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "Мобильная разработка с Kivy",
- "GUI приложения на Python"
- ]
- self.placeholder = Label(
- text="Введите запрос для поиска",
- size_hint_y=None,
- height=40,
- color=(0.5, 0.5, 0.5, 1),
- halign='center'
- )
- self.results_layout.add_widget(self.placeholder)
- def on_text(self, instance, value):
- Clock.unschedule(self.update_suggestions)
- # Сначала обновляем suggestions, затем результаты
- self.update_suggestions_immediately(value)
- Clock.schedule_once(self.update_suggestions, 0.2)
- def update_suggestions_immediately(self, value):
- """Немедленное обновление suggestions без задержки"""
- query = value.lower().strip()
- if not query:
- self.suggestions = []
- return
- self.suggestions = [item for item in self.all_data if query in item.lower()]
- self.update_search_results(query)
- def update_suggestions(self, dt):
- query = self.search_input.text.lower().strip()
- self.dropdown.dismiss()
- if not query:
- return
- # Получаем ВСЕ совпадения для выпадающего списка
- self.suggestions = [item for item in self.all_data if query in item.lower()]
- self.dropdown.clear_widgets()
- # Создаем кнопки для всех совпадений
- for suggestion in self.suggestions:
- btn = Button(
- text=suggestion,
- size_hint_y=None,
- height=40
- )
- btn.bind(on_release=lambda btn: self.dropdown.select(btn.text))
- self.dropdown.add_widget(btn)
- if self.suggestions:
- self.dropdown.open(self.search_input)
- def update_search_results(self, query):
- self.results_layout.clear_widgets()
- if not query.strip():
- self.results_layout.add_widget(self.placeholder)
- return
- # Используем те же результаты, что и для dropdown
- results = self.suggestions
- if not results:
- self.results_layout.add_widget(Label(
- text="Ничего не найдено",
- size_hint_y=None,
- height=40,
- color=(0.7, 0.3, 0.3, 1),
- halign='center'
- ))
- else:
- for result in results:
- self.results_layout.add_widget(Button(
- text=result,
- size_hint_y=None,
- height=40,
- background_color=(0.9, 0.9, 0.9, 1)
- ))
- class SearchApp(App):
- def build(self):
- return SearchBox()
- if __name__ == '__main__':
- SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement