wx.DatePickerCtrl в диалоге игнорирует значение, введенное после нажатия возврата на wxGTK

У меня есть диалог с контролем выбора даты. Нажатие кнопки ввода в окне выбора даты закрывает диалоговое окно (как и ожидалось). Однако средство выбора даты не принимает значение, введенное пользователем на wxGTK. Запустите прикрепленный образец, нажмите кнопку, введите новую дату в палитре дат, используя клавиатуру, и нажмите Enter. Оператор печати показывает предыдущее значение средства выбора даты, а не только что введенное значение.

На 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()
14.10.2009 19:36:06
2 ОТВЕТА
РЕШЕНИЕ

У меня была аналогичная проблема. Я пытался просто звонить datepicker.Navigate()каждый раз, прежде чем получить дату из DatePickerCtrl с datepicker.GetValue(). Казалось, работает.

1
20.01.2010 19:36:59

Это, кажется, обойти проблему:

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()
0
14.10.2009 20:11:04