Brauche etwas hilfe mit Events

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
azrael1111
User
Beiträge: 23
Registriert: Sonntag 12. November 2006, 21:05
Wohnort: Croatien

Hallo Leute


Ich wolte mir ein AutoComplete txtCtrl erstellen und habe folgendes bisher gemacht

Code: Alles auswählen

self.txtUlica = wx.TextCtrl(-1, name='txtUlica',
              parent=self, pos=wx.Point(352, 48), size=wx.Size(120, 21),
              style=0, value='')
self.txtUlica.Bind(wx.EVT_TEXT, self.OnTxtUlicaText,
              self.txtUlica)
und dann noch der dazugehoerige EventHaendler.

Code: Alles auswählen

def OnTxtUlicaText(self, event):
        currentUlica = self.txtUlica.GetValue()
        suggestedUlica = self.DbAdapter.selByLike(currentUlica)
        self.txtUlica.SetValue(suggestedUlica)
        self.txtUlica.SetSelection(len(currentUlica), len(suggestedUlica))
Bisher Klappt alles hervorragend.

self.DbAdapter.selByLike(currentUlica) ist eine methode die einen string aus der DatenBank gibt der eingesetzt wird in die textctrl.

Was mir probleme mach ist dass wenn dass gewuenschte Wort zBSP "Auto" ist, und dass system mir "Automobil" ist, kann ich es nicht aendern. Es bleibt immer dass gleiche.

Ich dachte mir dass ich es mit einem Eventhaendler fuer den wx.EVT_TEXT_ENTER versuche, aber Klappt nicht.

So wie ich es verstanden habe reagier er auf den Tastendruck von Enter. aber bei mir klappt es nicht. Dass war eigentlich genau dass wass ich versucht habe. Wenn ich auf ENTER oder TAB druecke soll aus dem beispiel von vorhin "Auto" bleiben

Danke
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Meinst du sowas:

Code: Alles auswählen

import wx

class MainFrame(wx.Frame):

    COMPLETIONS = { "hallo": "hallo welt",
                    "te": "test",
                    "once" : "once upon a midnight dreary"}
    
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="Text Input")
        self.text = wx.TextCtrl(self, size=(200,100))
        # style=wx.TE_PROCESS_TAB
        self.text.Bind(wx.EVT_CHAR, self.test, self.text)         
        self.Show(True)

        
    def test(self, evt):
        if evt.GetKeyCode() == wx.WXK_TAB:
            val = self.text.GetValue()
            self.text.SetValue(self.COMPLETIONS.get(val, val))
            self.text.SetInsertionPointEnd()
        else:
            evt.Skip()

        
app = wx.PySimpleApp()
frame = MainFrame()
app.MainLoop()
Hier wird nach druecken der TAB-Taste vervollstaendigt, falls moeglich. Ich dachte erst, ich wuerde style=wx.TE_PROCESS_TAB benoetigen, in diesem Fall klappt es aber auch ohne...

Ich sehe gerade, du willst es wahrscheinlich genau andersrum, aber obiges Bsp. solltest du ensprechend aendern koennen. Dein Problem scheint zu sein (schwierig zu sagen ohne lauffaehigen Code), dass egal was du machst, immer vervollstaendigt wird, ich denke EVT_CHAR ist hier wohl besser als EVT_TEXT. TE_PROCESS_ENTER koenntest du auch noch brauchen...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten