Как я могу обновить 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()
689   1  

1 ответ:

Вот пошаговое руководство, как достичь ваших ожиданий

  1. Создайте список всех доступных для поиска элементов в списке, например, назовите его search_items
  2. свяжите событие EVT_CHAR с вашим TextCtrl, например, назовите обработчик событий on_char
  3. в методе on_char, получить введенную строку в TextCtrl с GetValue методом
  4. очистите ListBox и добавьте соответствующие строки в search_items к ListBox
Примечание: не забудьте очистить ListBox для каждого события 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

    Ничего не найдено.