Advertisement
soulseb

poisk

Jun 10th, 2025
878
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.38 KB | None | 0 0
  1. from kivy.config import Config
  2. Config.set('graphics', 'width', '360')
  3. Config.set('graphics', 'height', '640')
  4. Config.set('graphics', 'resizable', '0')
  5.  
  6. from kivy.app import App
  7. from kivy.lang import Builder
  8. from kivy.animation import Animation
  9. from kivy.core.window import Window
  10. from kivy.metrics import dp
  11. from kivy.uix.boxlayout import BoxLayout
  12. from kivy.clock import Clock
  13.  
  14. Builder.load_string('''
  15. <SearchAppUI>:
  16.    orientation: 'vertical'
  17.    spacing: dp(5)
  18.    
  19.    # Плашка результатов (изначально свернута)
  20.    BoxLayout:
  21.        id: result_panel
  22.        size_hint_y: None
  23.        height: 0
  24.        opacity: 0
  25.        canvas.before:
  26.            Color:
  27.                rgba: 0.2, 0.8, 0.4, 0.9
  28.            Rectangle:
  29.                pos: self.pos
  30.                size: self.size
  31.        Label:
  32.            id: result_label
  33.            text: 'Результат поиска'
  34.            color: 1, 1, 1, 1
  35.            font_size: dp(18)
  36.            bold: True
  37.            halign: 'center'
  38.    
  39.    # Основная область контента
  40.    ScrollView:
  41.        id: main_scroll
  42.        size_hint_y: 1
  43.        do_scroll_y: not search_panel.is_raised
  44.        
  45.        BoxLayout:
  46.            orientation: 'vertical'
  47.            size_hint_y: None
  48.            height: self.minimum_height
  49.            
  50.            Label:
  51.                text: 'Основной контент приложения\\n\\n' * 20
  52.                size_hint_y: None
  53.                height: self.texture_size[1]
  54.                padding: dp(10), dp(10)
  55.    
  56.    # Поисковая панель (внизу)
  57.    BoxLayout:
  58.        id: search_panel
  59.        size_hint_y: None
  60.        height: dp(60)
  61.        pos_hint: {'x': 0, 'y': 0}
  62.        padding: dp(10)
  63.        spacing: dp(5)
  64.        is_raised: False
  65.        
  66.        TextInput:
  67.            id: search_input
  68.            hint_text: 'Введите запрос...'
  69.            multiline: False
  70.            size_hint_x: 0.8
  71.            padding: [dp(10), (self.height - self.line_height)/2]
  72.            font_size: dp(16)
  73.            on_focus: root.on_search_focus(*args)
  74.        
  75.        Button:
  76.            text: 'Найти'
  77.            size_hint_x: 0.2
  78.            font_size: dp(16)
  79.            on_press: root.do_search()
  80. ''')
  81.  
  82. class SearchAppUI(BoxLayout):
  83.     def __init__(self, **kwargs):
  84.         super().__init__(**kwargs)
  85.         Window.bind(on_keyboard=self.on_keyboard)
  86.         self.keyboard_height = dp(300)
  87.    
  88.     def on_search_focus(self, instance, focused):
  89.         if focused:
  90.             # Поднимаем панель над клавиатурой
  91.             self.ids.search_panel.is_raised = True
  92.             Animation(
  93.                 y=self.keyboard_height + dp(10),
  94.                 duration=0.2,
  95.                 t='out_quad'
  96.             ).start(self.ids.search_panel)
  97.            
  98.             # Прокручиваем контент вниз
  99.             Animation(
  100.                 scroll_y=0,
  101.                 duration=0.3
  102.             ).start(self.ids.main_scroll)
  103.         else:
  104.             # Опускаем панель обратно
  105.             self.ids.search_panel.is_raised = False
  106.             Animation(
  107.                 y=0,
  108.                 duration=0.2,
  109.                 t='out_quad'
  110.             ).start(self.ids.search_panel)
  111.    
  112.     def do_search(self):
  113.         query = self.ids.search_input.text
  114.         if not query:
  115.             return
  116.            
  117.         # Обновляем текст результата
  118.         self.ids.result_label.text = f"Найдено: {query}"
  119.        
  120.         # Показываем плашку
  121.         self.ids.search_input.focus = False
  122.         anim = Animation(height=dp(50), opacity=1, duration=0.3)
  123.         anim.start(self.ids.result_panel)
  124.        
  125.         # Через 3 секунды скрываем
  126.         Clock.schedule_once(self.hide_panel, 3)
  127.    
  128.     def hide_panel(self, dt):
  129.         Animation(height=0, opacity=0, duration=0.3).start(self.ids.result_panel)
  130.    
  131.     def on_keyboard(self, window, key, *args):
  132.         if key == 27:  # ESC
  133.             self.ids.search_input.focus = False
  134.             return True
  135.  
  136. class SearchApp(App):
  137.     def build(self):
  138.         Window.clearcolor = (0.4, 0.4, 0.4, 1)
  139.         return SearchAppUI()
  140.  
  141. if __name__ == '__main__':
  142.     SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement