代码之家  ›  专栏  ›  技术社区  ›  Frank Niessink

对话框中的wx.DatePickerCtrl忽略在wxGTK上点击return后输入的值

  •  1
  • Frank Niessink  · 技术社区  · 15 年前

    我有一个带有日期选择器控件的对话框。按日期选择器中的enter键关闭对话框(如预期)。但是,日期选择器不会拾取用户在wxGTK上输入的值。运行附加的示例,单击按钮,使用键盘在日期选择器中输入新日期,然后按enter键。print语句显示日期选择器的上一个值,而不是刚刚输入的值。

    在wxMSW上,它按预期工作。在这两种情况下都使用wxPython 2.8.10.1。

    有什么想法吗?工作?

    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 回复  |  直到 7 年前
        1
  •  1
  •   Rickard Lindberg    15 年前

    datepicker.Navigate() datepicker.GetValue() . 这似乎奏效了。

        2
  •  0
  •   Frank Niessink    15 年前

    这似乎解决了这个问题:

    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()