Живой поиск kivy. Приложение сильно тупит, зависает во время живого поиска по базе данных
Сделал живой поиск по базе данных в двух вариантах.
- Одноразовый. После выбора и добавления в строку, если искать второй раз не перегружая программу, происходит вылет. Меню создает родительский виджет в SL2, который не выгружается после удаления меню, и к нему нельзя добавить меню второй раз.
- Способ, который в отрывке кода ниже, реализован без выборки среза, и начинает искать с первой буквы. Он стал грузить приложение сразу с запуска(белый экран до минуты). после выбора долго нельзя нажать на кнопку ввода - зависает. Функция, вызов которой тормозит программу, ниже. Что изменить чтобы приложение перестало зависать или вылетать(widgetExcepshion уже есть родитель - причина вылета).
def insertText(self, *args): # Забираем ввод первых трех символов ввода (#2 вариант)
self.menu.clear_widgets() # Очищаем меню чтобы не было повторов
self.con = sqlite3.connect('tikers.db')
self.cursorObj = self.con.cursor()
dat = []
tC1 = self.textCompany.text
self.cursorObj.execute(f"SELECT * FROM tiks WHERE company LIKE '%{tC1}%'")
rows = self.cursorObj.fetchall()
for row in rows:
dat.append(row)
self.menu_items = []
for id, name in dat: # Создаем меню
self.menu_items.append({
"text": f"{name}", 'height': "20dp",
"top_pad": "2dp", "bot_pad": "2dp"})
self.menu = MDDropdownMenu(
caller=self.textCompany,
items=self.menu_items,
position="center",
width_mult=0)
self.con.commit()
self.con.close()
self.menu.bind(on_release=self.setItem)
def setItem(self, instance_menu, instance_menu_item):
def setItem(interval):
self.textCompany.text = instance_menu_item.text
instance_menu.dismiss()
self.menu.clear_widgets() # Очищаем список меню чтобы не было повторов
Clock.schedule_once(setItem, 0.2) # Вставляет текст в строку
часть kv
MDTextField:
id: textF_1
size_hint: 0.5, None
hint_text: "*Компания"
height: "30sp"
multiline: False
pos_hint: {'center_x': .3, 'center_y': 0.8}
on_text: root.ids.listDialog.insertText() #on_focus
on_text: root.ids.listDialog.menu.open() #on_focus
Ответы (1 шт):
Автор решения: ProBuro
→ Ссылка
Нашел решение. Нужно вставить конструкцию, которая предотвращает запуск on_text пока в него не начнут вводить текст. Тогда он не срабатывает с запуском приложения и не грузит его.
on_text: if self.text: root.ids.listDialog.insertText()
on_text: if self.text: root.ids.listDialog.menu.open()