Как я могу обновить wxPython, в списке, основанные на некоторых строку поиска?
Задача:
Как я могу обновить wx.ListBox на основе некоторой строки поиска ?
На практике:
- У меня есть 2 объекта: wx.TextCtrl + wx.ListBox
- действие: после того, как текст записан в wx.TextCtrl, Список wx.ListBox должен быть обновлен совпадениями
Мой Код:
def updateList(event):
# Get all values from wx.ListBox obj
searchTerm = str([textareaExpectedResults.GetString(i) for i in range(textareaExpectedResults.GetCount())])
print searchTerm
# Get match
matchValues = sorted(['entry', 'test'])
textareaExpectedResults.Clear()
i = 0
for item in matchValues:
if searchTerm.lower() in item.lower():
i += 1
textareaExpectedResults.Append(item)
else:
print "not found"
pass
# Bind the function to search box
searchExpectedResults.Bind(wx.EVT_CHAR, updateList)
Выходной Ток:
Не найден, когда я начинаю писать.
Желаемый Результат:
Принесите спички, когда я начну писать. (Если я наберу: "en", то приложение должно получить опция "вход". Естественно, что запись присутствует в списке)
Пожалуйста, поделитесь намеком на это.
Правка 1:
# Basic app
import wx
app = wx.App(redirect=False)
top = wx.Frame(None)
top.SetSize(320,280)
sizer = wx.GridBagSizer()
def on_char(event):
getValue = searchExpectedResults.GetValue() # get the entered string in TextCtrl with GetValue method
print getValue
search_items = sorted(['test', 'entry']) # Create a list of all searchable items in a list
for item in search_items:
if getValue in item:
print item
textareaExpectedResults.Clear()
textareaExpectedResults.Append(item) # Clear the ListBox and append the matching strings in search_items to the ListBox
searchExpectedResults = wx.TextCtrl(top, -1, "", size=(175, -1))
sizer.Add(searchExpectedResults,(2,8),(2,14),wx.EXPAND)
searchExpectedResults.Bind(wx.EVT_CHAR, on_char) # Bind an EVT_CHAR event to your TextCtrl
search_items = sorted(['test', 'entry'])
textareaExpectedResults = wx.ListBox(top, choices=search_items, size=(270,250))
sizer.Add(textareaExpectedResults,(6,8),(2,14),wx.EXPAND)
top.Sizer = sizer
top.Sizer.Fit(top)
top.Show()
app.MainLoop()
1 ответ:
Вот пошаговое руководство, как достичь ваших ожиданий
Примечание: не забудьте очистить
- Создайте список всех доступных для поиска элементов в списке, например, назовите его
search_items- свяжите событие
EVT_CHARс вашимTextCtrl, например, назовите обработчик событийon_char- в методе
on_char, получить введенную строку вTextCtrlсGetValueметодом- очистите
ListBoxи добавьте соответствующие строки вsearch_itemsкListBoxListBoxдля каждого события char. Если ваш список доступных для поиска элементов слишком велик, вы должны использовать другой подход, чем метод очистки/добавления.
Правка:
Просмотрев ваш код, я исправил его так, как вы хотите, не меняя его слишком сильно. Я использовал
wx.EVT_KEY_UP, потому что, когда ваш обработчик вызывается событиемwx.EVT_CHAR, вы не можете получить последнее значениеwx.TextCtrl. Если вы настаиваете наwx.EVT_CHAR, вы можете использоватьwx.CallAfterвdef on_char(event), задавая функцию обратного вызова, которая гарантированно будет выполнена после завершенияwx.EVT_CHAR. Примечание: Вы вызвалиtextareaExpectedResults.Clear()в цикле for, который был неправильным,я также переместил его до цикла for.import wx app = wx.App(redirect=False) top = wx.Frame(None) top.SetSize((320, 280)) sizer = wx.GridBagSizer() def on_char(event): event.Skip() getValue = searchExpectedResults.GetValue() # get the entered string in TextCtrl with GetValue method print getValue search_items = sorted(['test', 'entry']) # Create a list of all searchable items in a list textareaExpectedResults.Clear() for item in search_items: if getValue in item: print item textareaExpectedResults.Append(item) # Clear the ListBox and append the matching strings in search_items to the ListBox searchExpectedResults = wx.TextCtrl(top, -1, "", size=(175, -1)) sizer.Add(searchExpectedResults, (2, 8), (2, 14), wx.EXPAND) searchExpectedResults.Bind(wx.EVT_KEY_UP, on_char) # Bind an EVT_CHAR event to your TextCtrl search_items = sorted(['test', 'entry']) textareaExpectedResults = wx.ListBox(top, choices=search_items, size=(270, 250)) sizer.Add(textareaExpectedResults, (6, 8), (2, 14), wx.EXPAND) top.Sizer = sizer top.Sizer.Fit(top) top.Show() app.MainLoop()Если вы хотите использовать
wx.EVT_CHARВот пример, показывающий, как использоватьwx.CallAfter... def on_filter(): getValue = searchExpectedResults.GetValue() # get the entered string in TextCtrl with GetValue method print getValue search_items = sorted(['test', 'entry']) # Create a list of all searchable items in a list textareaExpectedResults.Clear() for item in search_items: if getValue in item: print item textareaExpectedResults.Append(item) # Clear the ListBox and append the matching strings in search_items to the ListBox def on_char(event): event.Skip() wx.CallAfter(on_filter) ... searchExpectedResults.Bind(wx.EVT_CHAR, on_char) # Bind an EVT_CHAR event to your TextCtrl ...
Comments