2015-11-18 15 views
2

問題:如何根據某個搜索字符串更新wxPython列表框?

我如何更新wx.ListBox基於某些搜索字符串? 實際上: - 我有2個OBJ文件: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) 
:一旦文本在 wx.TextCtrl寫下來,列表 wx.ListBox應該用火柴

我的代碼更新

當前輸出:

當我開始寫作時未找到。

所需的輸出:

取火柴,當我開始書面方式。 (如果我輸入:「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() 
+0

你可以用'wx.SearchCtrl'讓你的表格看起來更漂亮的例子。它與添加了開始字符串和取消按鈕的'wx.TextCtrl'相同。 – hdrz

回答

1

這裏是一個一步一步的指導如何達到你的期望

  1. 在列表中創建的所有搜索項的列表,例如將其命名爲search_items
  2. EVT_CHAR事件綁定到您的TextCtrl,例如,命名您的事件處理程序on_char
  3. 在方法on_char,得到TextCtrl輸入的字符串GetValue方法
  4. 清除ListBoxsearch_items追加匹配字符串到ListBox

注意:不要忘了清除每個char事件的ListBox。如果您的可搜索項目列表太大,則應使用與清除/附加方法不同的方法。


編輯:

審覈您的代碼後,我固定它,只要你想在不改變太多。我使用wx.EVT_KEY_UP,因爲當您的處理程序被wx.EVT_CHAR事件調用時,無法獲取wx.TextCtrl的最新值。如果你堅持要wx.EVT_CHAR,你可以使用wx.CallAfterdef on_char(event)中給出回調函數,保證在wx.EVT_CHAR完成後執行回調函數。注意:您在for循環中調用了textareaExpectedResults.Clear(),這是錯誤的,我也在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 
... 
+0

我已經嘗試了你的方法,但是我不能完全理解它的工作原理。 def on_char(event): getValue = searchExpectedResults.GetValue()#使用GetValue方法在TextCtrl中獲取輸入的字符串 print getValue search_items = sorted(['test','entry'])#創建一個所有可搜索項目的列表在search_items用於項目的列表 : 如果在的getValue項目: 打印項目 textareaExpectedResults.Clear() textareaExpectedResults.Append(項目)#清除ListBox和search_items匹配字符串添加到列表框 – george

+0

您可以編輯您問題到目前爲止你做了什麼? – ozy

+0

嗨,是的,我已經編輯了最新代碼 – george