0

入力時にリストからコンボボックスを選択するために他に何が必要なのかわかりません。最終的に SetInsertionPoint を追加します。しかし、今のところ、選択したアイテムは常に-1です

self.filter = wx.ComboBox(self, wx.ID_ANY, choices = '', style=wx.CB_DROPDOWN)

def OnTextChanged(self, event):
    sel = self.filter.GetSelection()
    print 'OnItemSelected %s' % sel
4

2 に答える 2

0

GetSelection() を単独で使用するには、ComboBox を読み取り専用に設定する必要があります。これは、1 つの文字をヒットしてクエリを実行するための優れた方法です。SetInsertionPoint と SetMark を使用すると、カーソルがクエリの次の文字列に移動します。私は Mike が提案した例を使用しました •Auto-Completion In wxPython wxComboBox を使用し、これらのインスタンスを使用するようにコードを変更しました。私は常に boxsizers と open 関数を使用しているので、wx.EVT_TEXT イベントを廃止する必要がありました。仕組みは次のとおりです。

##  copy/paste to text file
'''
73,"N WASHINGTON ST"
95,"BRIAR CREEK RD"
97,"N INDEPENDENCE AVE"
09,"N ADAMS ST"
13,"N JEFFERSON ST"
19,"N MADISON ST"
21,"QUAIL CREEK DR"
24,"INDIAN DR"
12,"CHEROKEE TRAIL"
50,"CORONADO TRAIL"
'''
import wx, os
from cStringIO import StringIO
import csv

class MainFrame(wx.Frame):
    def __init__(self, parent, choices=[], style=0):
        wx.Frame.__init__(self,None,wx.ID_ANY,title='test combo autocomplete',size=(225, 70))

        self.vbox= wx.BoxSizer(wx.VERTICAL)
        self.background = wx.Panel(self)
        self.OpenDir = wx.TextCtrl(self,style=wx.PROCESS_ENTER|wx.TE_CENTRE)
        self.filter = wx.ComboBox(self, wx.ID_ANY, style=wx.CB_DROPDOWN)
        self.OpenDir.Bind(wx.EVT_LEFT_UP,self.OnChooseRoot)
        self.filter.Bind(wx.EVT_TEXT, self.OnTextChanged)

        hsizer1 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer1.Add(self.OpenDir,1)        
        hsizer2 = wx.BoxSizer(wx.HORIZONTAL)
        hsizer2.Add(self.filter,1)

        self.vbox.Add(hsizer1,proportion = 0,flag = wx.EXPAND)
        self.vbox.Add(hsizer2,proportion = 0,flag = wx.EXPAND) 
        self.SetSizer(self.vbox)
        self.Show()
        self.OpenDir.SetValue("click to open directory")

    def OnTextChanged(self, event):
        def refresh():
            wnd = self.filter
            currentText = event.GetString()
            while wnd:
                print currentText
                wnd.Layout()
                print wnd.Layout()
                wnd = wnd.GetParent()
                self.filter.SetInsertionPoint(len(currentText))
                self.filter.SetMark(len(currentText), len(self.choices))
            self.filter.Refresh()
        refresh()
        event.Skip()

    def OnChooseRoot(self, event):
        self.dirname="" 
        dlg = wx.FileDialog(self, "choose a file to open", self.dirname,
                            "", "*.*", wx.OPEN) 
        if dlg.ShowModal() == wx.ID_OK:
            self.filename = dlg.GetFilename()
            self.dirname = dlg.GetDirectory()
            self.pathname = dlg.GetPath()
            self.f = open(os.path.join(self.dirname, self.filename), 'r')  
            self.text = self.f.read()
            labeltop = self.dirname + '\\'
            self.OpenDir.SetValue(labeltop + self.filename)

            sources = [StringIO(self.text)]
            for i, source in enumerate(sources):  
                c = list(csv.reader(source))                
                self.choices = [x[1] for x in c]
                self.filter.SetItems(self.choices)

app = wx.App(redirect=False)
frame = MainFrame(None)
app.MainLoop()
于 2013-10-25T19:48:20.143 に答える
0

この他のSOの回答には、あなたのために働くかもしれないカスタムコントロールがあります:

この wxPython wiki 記事からもアイデアを得ることができます

ドキュメントによると、マスクされたコンボボックス自体にこの機能がある可能性があることにも気付きました。

BaseMaskedComboBox - 一般的なマスク編集コンボボックスの基本クラス。値のオートコンプリートを許可します。

于 2013-10-24T14:59:31.337 に答える