wx.Dialog mit Escape key schließen
Verfasst: Samstag 24. Juli 2010, 10:13
Hallo, folgendes Beispiel:
Gleich vorweg. Der Code ist schon ein bisschen ein Durcheinander. Man sieht schon an den (verzweifelten) kommentaren, was ich schon alles versucht habe.
Entweder ich stehe auf der Leitung oder ich mache etwas falsch. Esc Key (und andere Key events) kommen nicht durch. Eins ginge schon, den Focus auf das TextCtrl zu setzen, das möchte ich aber nicht, das mus doch irgendwie anders gehen. 
Code: Alles auswählen
import wx
import sys
class ScrolledMessageDialog(wx.Dialog):
def __init__(self, parent, message, title, position = wx.DefaultPosition, size = (400, 300)):
wx.Dialog.__init__(self, parent, -1, title, position, size, wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.THICK_FRAME | wx.RESIZE_BORDER | wx.WANTS_CHARS)
#self.ID_CLOSE = 101
self.theSizer = wx.BoxSizer(wx.VERTICAL)
self.cmdSizer = wx.BoxSizer(wx.HORIZONTAL)
self.btnClose = wx.Button(self, wx.ID_CANCEL, "Close")
self.cmdSizer.Add(self.btnClose, 0, wx.SHAPED | wx.ALIGN_CENTER)
self.btnClose.SetDefault()
self.txtMessage = wx.TextCtrl(self, -1, message, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE | wx.TE_READONLY)
self.theSizer.Add(self.txtMessage, 9, wx.EXPAND)
self.theSizer.Add(wx.StaticText(self, -1, " "), 0, wx.SHAPED)
self.theSizer.Add(self.cmdSizer, 0, wx.SHAPED | wx.ALIGN_CENTER)
self.theSizer.Add(wx.StaticText(self, -1, " "), 0, wx.SHAPED)
self.SetAutoLayout(True)
self.SetSizer(self.theSizer)
self.Bind(wx.EVT_BUTTON, self.OnbtnClose, id=wx.ID_CANCEL)
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
#whatever i want to bind to the key, it doesn't work
##self.txtMessage.Bind(wx.EVT_CHAR, self.OnChar)
self.Bind(wx.EVT_CHAR, self.OnChar)
self.Bind(wx.EVT_KEY_DOWN, self.OnChar)
self.Bind(wx.EVT_CHAR_HOOK, self.OnCharHook)
self.SetEscapeId(wx.ID_CANCEL)
#self.SetAcceleratorTable(wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_ESCAPE, wx.ID_CANCEL),]))
def OnCharHook(self, event):
print "char hook"
if event.GetKeyCode() == wx.WXK_ESCAPE:
self.EndModal(wx.ID_CANCEL)
else:
event.Skip()
def OnChar(self, event):
print "onchar"
keycode = event.GetKeyCode()
if keycode == wx.WXK_ESCAPE:
self.Close(1)
def OnbtnClose(self, event):
print "close"
self.EndModal(1)
def OnKeyDown(self, event):
print "on key down"
if event.GetKeyCode() == wx.WXK_ESCAPE:
self.Close(1)
if __name__ == '__main__':
app = wx.App()
d = ScrolledMessageDialog(None, "message", "title")
d.ShowModal()
d.Destroy()
app.MainLoop()

