2009-10-14 6 views
1

J'ai un dialogue avec un contrôle du sélecteur de date. Si vous tapez enter dans le sélecteur de date, la boîte de dialogue se ferme (comme prévu). Cependant, le sélecteur de date ne récupère pas la valeur entrée par l'utilisateur sur wxGTK. Exécutez l'exemple joint, cliquez sur le bouton, entrez une nouvelle date dans le sélecteur de date, utilisez le clavier et appuyez sur Entrée. L'instruction d'impression affiche la valeur précédente du sélecteur de date, pas la valeur que vous venez d'entrer.wx.DatePickerCtrl dans la boîte de dialogue ignore la valeur entrée après avoir renvoyé le retour sur wxGTK

Sur wxMSW, cela fonctionne comme prévu. En utilisant wxPython 2.8.10.1 dans les deux cas.

Des idées? Solution de contournement?

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

Répondre

1

J'ai eu un problème similaire. J'ai essayé d'appeler simplement datepicker.Navigate() chaque fois avant de récupérer la date à partir du DatePickerCtrl avec datepicker.GetValue(). Cela a semblé fonctionner.

+0

Cela semble plus simple que mon travail, merci! –

0

Cela semble fonctionner autour de la question:

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