wxGTK中的对话框wx.DatePickerCtrl忽略回车后输入的值

1 投票
2 回答
2611 浏览
提问于 2025-04-15 15:04

我有一个对话框,里面有一个日期选择器。按下回车键时,日期选择器会关闭对话框(这是正常的)。但是,在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()。这样做似乎有效。

撰写回答