wxGTK中的对话框wx.DatePickerCtrl忽略回车后输入的值
我有一个对话框,里面有一个日期选择器。按下回车键时,日期选择器会关闭对话框(这是正常的)。但是,在wxGTK上,日期选择器并没有获取用户输入的值。运行附带的示例,点击按钮,在日期选择器中输入一个新日期,然后按回车。打印的结果显示的是日期选择器之前的值,而不是刚刚输入的值。
在wxMSW上,这个功能正常。两种情况下都使用的是wxPython 2.8.10.1。
有没有什么想法?有没有解决办法?
谢谢,Frank
import wx
class Dialog(wx.Dialog):
def __init__(self, *args, **kwargs):
super(Dialog, self).__init__(*args, **kwargs)
self.datepicker = wx.DatePickerCtrl(self)
self.button = wx.Button(self, label='OK')
self.button.SetDefault()
self.button.Bind(wx.EVT_BUTTON, self.onButton)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.datepicker)
sizer.Add(self.button)
self.SetSizerAndFit(sizer)
def onButton(self, event):
print self.datepicker.GetValue()
self.Close()
class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
super(Frame, self).__init__(*args, **kwargs)
self.button = wx.Button(self, label='Press me to open dialog')
self.button.Bind(wx.EVT_BUTTON, self.onButton)
def onButton(self, event):
dialog = Dialog(self, size=(200,30))
dialog.Show()
app = wx.App()
frame = Frame(None, size=(200,50))
frame.Show()
app.MainLoop()
2 个回答
0
这似乎是解决这个问题的一个方法:
import wx
class Dialog(wx.Dialog):
def __init__(self, *args, **kwargs):
super(Dialog, self).__init__(*args, **kwargs)
self.datepicker = wx.DatePickerCtrl(self)
# On wxGTK, intercept all keys:
if wx.Platform == '__WXGTK__':
comboCtrl = self.datepicker.GetChildren()[0]
comboCtrl.Bind(wx.EVT_KEY_DOWN, self.onKey)
self.button = wx.Button(self, label='OK')
self.button.SetDefault()
self.button.Bind(wx.EVT_BUTTON, self.onButton)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.datepicker)
sizer.Add(self.button)
self.SetSizerAndFit(sizer)
def onButton(self, event):
print self.datepicker.GetValue()
self.Close()
def onKey(self, event):
keyCode = event.GetKeyCode()
if keyCode == wx.WXK_RETURN:
# Move to the next field so that the contents of the text control,
# that might be edited by the user, are updated by the datepicker:
self.datepicker.Navigate()
# Next, click the default button of the dialog:
button = self.GetDefaultItem()
click = wx.CommandEvent()
click.SetEventType(wx.EVT_BUTTON.typeId)
wx.PostEvent(button, click)
elif keyCode == wx.WXK_TAB:
self.datepicker.Navigate(not event.ShiftDown())
else:
event.Skip()
class Frame(wx.Frame):
def __init__(self, *args, **kwargs):
super(Frame, self).__init__(*args, **kwargs)
self.button = wx.Button(self, label='Press me to open dialog')
self.button.Bind(wx.EVT_BUTTON, self.onButton)
def onButton(self, event):
dialog = Dialog(self, size=(200,30))
dialog.Show()
app = wx.App()
frame = Frame(None, size=(200,50))
frame.Show()
app.MainLoop()
1
我之前也遇到过类似的问题。我尝试在每次从日期选择器中获取日期之前,先调用一下 datepicker.Navigate()
。这样做似乎有效。