Advertisement
soulseb

test5

Jun 10th, 2025
991
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.13 KB | None | 0 0
  1. # для логов
  2. import datetime
  3. import inspect
  4. # для самой программы
  5. from kivy.app import App
  6. from kivy.uix.anchorlayout import AnchorLayout
  7. from kivy.uix.boxlayout import BoxLayout
  8. from kivy.uix.textinput import TextInput
  9. from kivy.uix.dropdown import DropDown
  10. from kivy.uix.button import Button
  11. from kivy.uix.scrollview import ScrollView
  12. from kivy.uix.label import Label
  13. from kivy.properties import ListProperty
  14. from kivy.clock import Clock
  15.  
  16. # проверка
  17. def log_var(var_name, var_value, log_file="test4.log", func_name=None):
  18.     """
  19.    Записывает в лог-файл название переменной, её значение и имя функции
  20.    :param var_name: название переменной (строка)
  21.    :param var_value: значение переменной
  22.    :param log_file: путь к лог-файлу (по умолчанию test4.log)
  23.    :param func_name: имя функции (если None, будет определено автоматически)
  24.    """
  25.     timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  26.    
  27.     # Если имя функции не указано, пытаемся определить автоматически
  28.     if func_name is None:
  29.         try:
  30.             # Получаем имя вызывающей функции (2 уровня выше в стеке вызовов)
  31.             func_name = inspect.currentframe().f_back.f_back.f_code.co_name
  32.         except:
  33.             func_name = "unknown"
  34.    
  35.     log_message = f"[{timestamp}] [{func_name}] {var_name} = {repr(var_value)}\n"
  36.    
  37.     with open(log_file, "a", encoding="utf-8") as f:
  38.         f.write(log_message)
  39.  
  40. class SearchBox(BoxLayout):
  41.     suggestions = ListProperty([])
  42.    
  43.     def __init__(self, **kwargs):
  44.         super(SearchBox, self).__init__(**kwargs)
  45.         self.orientation = 'vertical'
  46.        
  47.         # Контейнер для поля поиска
  48.         search_container = AnchorLayout(
  49.             anchor_x='center',
  50.             anchor_y='top',
  51.             size_hint=(1, None),
  52.             height=40
  53.         )
  54.        
  55.         self.search_input = TextInput(
  56.             hint_text='Введите поисковый запрос...',
  57.             size_hint=(1, None),
  58.             height=40
  59.         )
  60.         self.search_input.bind(text=self.on_text)
  61.         search_container.add_widget(self.search_input)
  62.         self.add_widget(search_container)
  63.        
  64.         # Выпадающий список (без ограничений)
  65.         self.dropdown = DropDown()
  66.         self.dropdown.bind(on_select=lambda i, x: (
  67.             setattr(self.search_input, 'text', x),
  68.             self.update_search_results(x)
  69.         ))
  70.        
  71.         # Область результатов
  72.         self.scroll = ScrollView(size_hint=(1, 1))
  73.         self.add_widget(self.scroll)
  74.        
  75.         self.results_layout = BoxLayout(
  76.             orientation='vertical',
  77.             size_hint_y=None,
  78.         )
  79.         self.results_layout.bind(minimum_height=self.results_layout.setter('height'))
  80.         self.scroll.add_widget(self.results_layout)
  81.        
  82.         self.all_data = [
  83.             "Python программирование",
  84.             "Kivy разработка приложений",
  85.             "Android приложения на Python",
  86.             "Изучение Kivy для начинающих",
  87.             "Примеры Kivy приложений",
  88.             "Работа с базами данных в Python",
  89.             "Мобильная разработка с Kivy",
  90.             "Мобильная разработка с Kivy",
  91.             "Мобильная разработка с Kivy",
  92.             "Мобильная разработка с Kivy",
  93.             "Мобильная разработка с Kivy",
  94.             "Мобильная разработка с Kivy",
  95.             "Мобильная разработка с Kivy",
  96.             "Мобильная разработка с Kivy",
  97.             "Мобильная разработка с Kivy",
  98.             "Мобильная разработка с Kivy",
  99.             "GUI приложения на Python"
  100.         ]
  101.        
  102.         self.placeholder = Label(
  103.             text="Введите запрос для поиска",
  104.             size_hint_y=None,
  105.             height=40,
  106.             color=(0.5, 0.5, 0.5, 1),
  107.             halign='center'
  108.         )
  109.         self.results_layout.add_widget(self.placeholder)
  110.    
  111.     def on_text(self, instance, value):
  112.         Clock.unschedule(self.update_suggestions)
  113.         # Сначала обновляем suggestions, затем результаты
  114.         self.update_suggestions_immediately(value)
  115.         Clock.schedule_once(self.update_suggestions, 0.2)
  116.    
  117.     def update_suggestions_immediately(self, value):
  118.         """Немедленное обновление suggestions без задержки"""
  119.         query = value.lower().strip()
  120.         if not query:
  121.             self.suggestions = []
  122.             return
  123.  
  124.         self.suggestions = [item for item in self.all_data if query in item.lower()]
  125.         self.update_search_results(query)
  126.  
  127.     def update_suggestions(self, dt):
  128.         query = self.search_input.text.lower().strip()
  129.         self.dropdown.dismiss()
  130.  
  131.         if not query:
  132.             return
  133.            
  134.         # Получаем ВСЕ совпадения для выпадающего списка
  135.         self.suggestions = [item for item in self.all_data if query in item.lower()]
  136.         self.dropdown.clear_widgets()
  137.        
  138.         # Создаем кнопки для всех совпадений
  139.         for suggestion in self.suggestions:
  140.             btn = Button(
  141.                 text=suggestion,
  142.                 size_hint_y=None,
  143.                 height=40
  144.             )
  145.             btn.bind(on_release=lambda btn: self.dropdown.select(btn.text))
  146.             self.dropdown.add_widget(btn)
  147.        
  148.         if self.suggestions:
  149.             self.dropdown.open(self.search_input)
  150.  
  151.     def update_search_results(self, query):
  152.         self.results_layout.clear_widgets()
  153.  
  154.         if not query.strip():
  155.             self.results_layout.add_widget(self.placeholder)
  156.             return
  157.            
  158.         # Используем те же результаты, что и для dropdown
  159.         results = self.suggestions
  160.        
  161.         if not results:
  162.             self.results_layout.add_widget(Label(
  163.                 text="Ничего не найдено",
  164.                 size_hint_y=None,
  165.                 height=40,
  166.                 color=(0.7, 0.3, 0.3, 1),
  167.                 halign='center'
  168.             ))
  169.         else:
  170.             for result in results:
  171.                 self.results_layout.add_widget(Button(
  172.                     text=result,
  173.                     size_hint_y=None,
  174.                     height=40,
  175.                     background_color=(0.9, 0.9, 0.9, 1)
  176.                 ))
  177.  
  178. class SearchApp(App):
  179.     def build(self):
  180.         return SearchBox()
  181.  
  182. if __name__ == '__main__':
  183.     SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement