2009-06-04 7 views

Répondre

3

Vous pouvez ignorer une mise à jour du minuteur en recherchant la fenêtre qui a le focus (en utilisant FindFocus) et en la comparant à votre fenêtre TextCtrl. Ensuite, si votre TextCtrl a le focus, vous pouvez le laisser seul. Voici un exemple:

import wx 

class TestFrame(wx.Frame): 

    def __init__(self): 
     self.count = 0 
     wx.Frame.__init__(self, None, -1, "test frame", size=(200, 100)) 
     self.panel = wx.Panel(self, -1) 
     button = wx.Button(self.panel, -1, "b", pos=(10, 40)) 
     self.text = wx.TextCtrl(self.panel, -1, `self.count`, size=(50, 25)) 
     self.timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.incr_text) 
     self.timer.Start(1000) 

    def incr_text(self, event): 
     self.count += 1 
     f = self.FindFocus() 
     if not f==self.text: 
      self.text.SetValue(`self.count`) 

if __name__=="__main__": 
    app = wx.PySimpleApp() 
    TestFrame().Show() 
    app.MainLoop() 
+0

Cela a très bien fonctionné. Merci! Au lieu de "sinon f == self.text", j'ai utilisé "sinon f dans [self.text, self.button_goto]" pour m'assurer que la minuterie n'a pas écrasé la zone de texte lorsque l'utilisateur a cliqué sur le " goto "bouton. J'ai également ajouté un appel "self.SetFocus()" dans ma méthode onGoto pour retirer le focus du bouton une fois qu'il a été cliqué. – JcMaco

+0

De rien, et je suis content que cela a fonctionné pour vous. – tom10

+0

Question de suivi: Si j'inclue un curseur dans l'interface graphique et que je le mets en place de manière à ce qu'il soit déplacé, sa valeur actuelle est affichée dans la zone de texte (la minuterie est en pause). Une fois le curseur relâché, le minuteur peut maintenant reprendre l'écriture du texte dans la zone de texte. Quels événements puis-je utiliser pour y parvenir? Mon curseur est lié à EVT_SLIDER et il ne semble pas y avoir moyen de vérifier l'état des boutons de la souris avec cet événement. – JcMaco

Questions connexes