Key Event geht verloren?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

Hallo,

im folgenden Quelltext soll der Handler "OnKeyDown()" bei Tastendruck aufgerufen werden
und wenn es Enter ist das angezeigt werden (auf stdout)

Code: Alles auswählen

# -*- coding: cp1252 -*-

import  wx

class SFrame(wx.Frame):

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, size=(800,500),style= wx.CLOSE_BOX |
                                                                         wx.SYSTEM_MENU |
                                                                         wx.CAPTION |
                                                                         wx.SIMPLE_BORDER |
                                                                         wx.MINIMIZE_BOX)
        
        #---------------menu----------------------------------------------------
        menuBar1 = wx.MenuBar()           
        filemenu = wx.Menu()                

        # add the items to the filemenu, using \tKeyName automatically creates an accelerator
        filemenu.Append(wx.ID_EXIT, "E&xit\tAlt-X", "Hilfetext1 in statusbar")
        fo=filemenu.Append(-1, "&Open file\tAlt-O", "Hilfetext2 in statusbar")        

        # filemenu, menubar, statusbar
        menuBar1.Append(filemenu, "&File")
        self.SetMenuBar(menuBar1)
        self.CreateStatusBar()

        self.text10 = wx.TextCtrl(self, -1, '', size=(200, 20))
      
        
        #---------------Buttons-------------------------------------------------
        close_btn = wx.Button(self, -1, "Close")
        other_btn = wx.Button(self, -1, "other fnct.")
        #---------------sizers--------------------------------------------------
        self.sizerb=wx.BoxSizer(wx.HORIZONTAL)
        self.sizerSp1=wx.BoxSizer(wx.HORIZONTAL)
        self.sizerSp2=wx.BoxSizer(wx.HORIZONTAL)
        self.sizerSp3=wx.BoxSizer(wx.HORIZONTAL)
        #all 4 sizers together in a vbox-sizer:
        self.sizer0=wx.BoxSizer(wx.VERTICAL)
        self.sizerb.Add((20,20))
        self.sizerb.Add(close_btn)          #add buttonleiste
        self.sizerb.Add((20,20))        
        self.sizerb.Add(other_btn)
        self.sizer0.Add(self.sizerb)        #add sizer buttonleiste
        self.sizer0.Add((20,20))            #space-line
        self.sizer0.Add(self.sizerSp1)      
        self.sizer0.Add((20,20))            #space-line
        self.sizer0.Add(self.sizerSp2)        
        self.sizer0.Add((20,20))            #space-line
        self.sizer0.Add(self.sizerSp3)      
        self.sizer0.Add((20,20))            #space-line
        self.SetSizer(self.sizer0)

        self.sizerSp1.Add((20,20))
        txt1 = wx.StaticText(self, -1, "xx1: ")          
        txt1.SetFont(wx.Font(24, wx.SWISS, wx.NORMAL, wx.BOLD))
        self.sizerSp1.Add(txt1)
        self.sizerSp1.Add((20,20))
        self.sizerSp1.Add(self.text10)
        self.Fit()
        self.Centre()

        #--------------- bindings ----------------------------------------------
        self.Bind(wx.EVT_BUTTON,   self.OnTimeToClose, close_btn)
        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown, self.text10)
        self.Bind(wx.EVT_MENU,     self.OnTimeToClose, id=wx.ID_EXIT)


    #----------------event handlers:----------------------------------------------
    def OnSelect(self, event):
        print event.GetSelection()
        
    def OnTimeToClose(self, evt):
        """called when close-button is clicked or exit is choosen"""
        self.Close()

    def OnKeyDown(self, event):
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_RETURN:
            print 'ET'
        event.Skip()



  
#---------------main-------------------------------------------------
class SApp(wx.App):
    def OnInit(self):
        frame = SFrame(None, 'Test')
        self.SetTopWindow(frame)
        print "stdout window: "
        frame.Show(True)
        return True
        

if __name__ == '__main__':
    app = SApp(redirect = False)                               #stdio will stay at the console...
    print 'mainloop entered'
    app.MainLoop()
Aber irgendwo geht der Event verloren oder so....

Gruß
joh
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,

das TextCtrl sendet kein KeyDown-Event. Du musst EVT_TEXT und für die Enter-Taste EVT_TEXT_ENTER verwenden. Damit das Ctrl die Enter-Taste auch verarbeitet, muss es den style TE_PROCESS_ENTER haben.
Minimalbeispiel:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import  wx

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        text = wx.TextCtrl(self, size=(200,-1), style=wx.TE_PROCESS_ENTER)
        self.Bind(wx.EVT_TEXT, self.OnTextUpdate, text)
        self.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter, text)
        self.Fit()
    def OnTextUpdate(self, event):
        print 'text is', event.GetString()
        event.Skip()
    def OnTextEnter(self, event):
        print 'enter'
        event.Skip()

if __name__ == '__main__':
    app = wx.App()
    frm = MyFrame(None)
    frm.Show()
    app.MainLoop()
Gruß
Norbert
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

:) so ist es was geworden. Allerbesten Dank!
Nur in 'wxp in action' hab ich dazu nichts gefunden...

Gruß
joh
Antworten