Partage
  • Partager sur Facebook
  • Partager sur Twitter

[wxPython] Problème de focus sur IHM

Python 2.7

Sujet résolu
    16 décembre 2015 à 9:36:06

    Bonjour,


    J'utilise python 2.7 et wxpython pour mon IHM. Je débute, et comme beaucoup de débutants à priori, je lutte avec la création des IHM.

    Aujourd'hui mon IHM comporte trois zones (correspondant à 2 panels et 1 StatusBar) :
    • Zone de bouton en haut
    • Corps d'application contenant une grille
    • StatusBar en bas contenant des champs TextCtrl



    Elles sont instanciées de la manière suivante :

    class PannelMenu(wx.Panel):
        def __init__(self,parent):
            wx.Panel.__init__(self, parent, -1, size = (1280, 90), pos = (0,0))
     
            self.m_parent = parent
            self.m_sizeChanged = False
     
            self.m_parent.Bind(wx.EVT_SIZE, self.OnSize)
            self.m_parent.Bind(wx.EVT_IDLE, self.OnIdle)
     
            #=======================================================================
            # Création des boutons de menu
            #=======================================================================
            pic=wx.Bitmap("img/nouveau.png", \
                wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
            self.buttonNew=wx.BitmapButton(self, -1, pic, pos=(10,10), size = (80,70))
            self.Bind(wx.EVT_BUTTON,self.New, self.buttonNew)
            self.buttonNew.SetDefault()
     
            # ... et les autres boutons + évènements
    class pannelParametre(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1, size = (1280, 500), pos = (0,91))
     
            self.m_parent = parent
            self.m_sizeChanged = False
     
            self.m_parent.Bind(wx.EVT_SIZE, self.OnSize)
            self.m_parent.Bind(wx.EVT_IDLE, self.OnIdle)
     
     
            self.myGrid = gl.Grid(self)
            self.myGrid.CreateGrid(15, 7) 
            self.myGrid.EnableEditing(False)  
            self.myGrid.SetSelectionMode(self.myGrid.wxGridSelectRows)
     
     
            self.myGrid.SetColLabelValue(0, "System parameter")
            self.myGrid.SetColLabelValue(1, "Value")
            self.myGrid.SetColLabelValue(2, "")
            self.myGrid.SetColLabelValue(3, "Minimum Value")
            self.myGrid.SetColLabelValue(4, "Maximum Value")
            self.myGrid.SetColLabelValue(5, "Resolution")
            self.myGrid.SetColLabelValue(6, "Unit")
     
            self.myGrid.AutoSize()
     
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.myGrid)
            self.SetSizer(sizer)

    Le tout est appelé par :

    class IhmGenerale(wx.Frame):
        def __init__(self,parent,id,title):
            wx.Frame.__init__(self, parent = None, id = 1, title = title, size = (1280, 600))
            wx.Frame.SetSizeHints(self, 1280, 600)
     
            self.parent = parent
     
            self.conteneurMenu = PannelMenu(self)
            self.conteneurGrille = pannelParametre(self)
            self.conteneurInformations = PannelInformation(self)
            self.SetStatusBar(self.conteneurInformations)
     
     
            self.Show(True)

    Outre le fait que ma grille est très mal intégrée car sa taille ne s'adapte pas correctement (ne prend pas tout l'espace disponible, et si j'ajoute beaucoup de lignes elle passe par dessus la statusBar...), et pour cela je suis preneuse de conseil.


    Mon problème actuel est le suivant : Mes contrôles TextCtrl, une fois que je les rend modifiable avec la fonction Enable, j'ai beau cliquer dans le champs, ils ne prennent jamais le focus. C'est la grille qui a le focus. Je ne comprend pas pourquoi.
    J'ai essayé d'enlever le Disable() a l'instanciation mais ça ne change rien. Quelqu'un a une idée ?


    Merci d'avance.





    -
    Edité par Kawaï 16 décembre 2015 à 9:36:43

    • Partager sur Facebook
    • Partager sur Twitter
      21 décembre 2015 à 11:43:42

      Bonjour,

      Je fais un up de mon sujet. Voilà ce que j'aimerai obtenir :

      En gros une barre en haut de la fenêtre contenant des bitmap boutons, une grille qui prenne le corps de la fenêtre et une statusBar en bas.

      Pour le moment j'arrive à avoir ma grille et ma statusBar de correct, j'ai refais un programme vierge pour arriver à avoir une base d'IHM. Mon problème est le suivant : comment intégrer la barre avec les bitmaps boutons :

      Voici pour l'instant mon code :

      #!/usr/bin/python
      # -*- coding: iso-8859-1 -*-
      
      
      try:
          import wx
          import wx.grid as gridlib
      except ImportError:
          raise ImportError,"The wxPython module is required to run this program"
      
      
      class Fenetre(wx.Frame):
          def __init__(self, parent, title):
              wx.Frame.__init__(self, parent, -1, title, size=(1280, 600))
      
              self.sb = wx.StatusBar(self)
              self.sb.SetFieldsCount(2)
              self.sb.SetStatusWidths([-1, -1])
              
              self.sb.SetStatusText("Customer Reference : ", 1)
              self.t1 = wx.TextCtrl(self.sb, -1, "", size=(200, -1))
              
              
              self.SetStatusBar(self.sb)
      
              self.lignes = 35
              self.colones = 7
              self.enr = 0
              self.chemain_fichier = u"Pas encore enregistré"
              
                     
              panel = wx.Panel(self)
              
      
              self.tableau = gridlib.Grid(panel,-1,size=(1200,500))
              self.tableau.CreateGrid(self.lignes,self.colones)
      
      
      
              sizer = wx.BoxSizer(wx.VERTICAL)
              sizer.Add(self.tableau, 1, wx.ALL|wx.GROW, 10)
              panel.SetSizer(sizer)
              panel.Layout()
              self.Centre()
      
      
      
      if __name__ == "__main__":
          app = wx.App()
          frame = Fenetre(None,'ParamEACB')
          frame.Show(True)
          app.MainLoop()

      Je ne sais pas quelle est la bonne pratique pour ce cas là. Est-ce que je dois intégrer deux panels dans la Frame (un pour les boutons, l'autre pour la grille), ou bien rajouter un panel dans celui déjà présent ? Ou juste insérer mes boutons directement avant la grille ? (Dans ce dernier cas, comment faire pour ne pas que les éléments se chevauchent ?)

      Merci d'avance pour votre aide !

      • Partager sur Facebook
      • Partager sur Twitter
        22 décembre 2015 à 14:11:29

        Problème résolu grâce à ce lien -> Gettingstarted with wxPython

        Pour ma solution, j'ai donc finalement opté pour ceci :

        • Une Frame
        • qui contient une statusBar
        • et un sizer contenant ma grille
        • et un second sizer imbriqué dans le premier, qui contient les boutons de menu



        Voici le code

        #!/usr/bin/python
        # -*- coding: iso-8859-1 -*-
         
        try:
            import wx
            import wx.grid as gl
        except ImportError:
            raise ImportError,"The wxPython module is required to run this program"
         
        class IhmGenerale(wx.Frame):
            def __init__(self,parent,id,title):
                wx.Frame.__init__(self, parent = None, id = 1, title = title, size = (1280, 600))
                wx.Frame.SetSizeHints(self, 1280, 600)
         
                self.parent = parent
         
                ###################################################################
                ###                            StatusBar                        ###
                ###################################################################
                self.sb = wx.StatusBar(self)
                self.sb.SetFieldsCount(4)        
                self.sb.SetStatusWidths([-4, -3, -3, -1]) # Définition des 4 zones d'affichage de la barre d'information
         
                self.m_sizeChanged = False
                self.sb.Bind(wx.EVT_SIZE, self.OnSize)
                self.sb.Bind(wx.EVT_IDLE, self.OnIdle)
         
                self.sb.SetStatusText("Fichier : ", 0) 
         
                self.sb.SetStatusText("Customer Reference : ", 1)
                self.sb.t1 = wx.TextCtrl(self.sb, -1, "", size=(200, -1))
                self.sb.t1.Disable()
         
                self.sb.SetStatusText("Auteur : ", 2)
                self.sb.t2 = wx.TextCtrl(self.sb, -1, "", size=(200, -1))
                self.sb.t2.Disable()
         
                self.sb.SetStatusText("Version 1.0", 3)
                self.SetStatusBar(self.sb)
                ###################################################################
         
         
                ###################################################################
                ###                        Barre de Menu                        ###
                ###################################################################        
                self.sizerButton = wx.BoxSizer(wx.HORIZONTAL)
         
                pic=wx.Bitmap("img/nouveau.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonNew=wx.BitmapButton(self, -1, pic, pos=(10,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON,self.New, self.buttonNew)
                self.buttonNew.SetDefault()
                self.buttonNew.Disable()
                self.buttonNew.SetToolTipString('Nouveau')
                self.sizerButton.Add(self.buttonNew, 1, wx.EXPAND)
         
                pic2=wx.Bitmap("img/open.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonOpen=wx.BitmapButton(self, -1, pic2, pos=(100,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.OnOpen, self.buttonOpen)
                self.buttonOpen.SetDefault()
                self.buttonOpen.SetToolTipString('Ouvrir')
                self.sizerButton.Add(self.buttonOpen, 1, wx.EXPAND)
         
                pic3=wx.Bitmap("img/save.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonSave=wx.BitmapButton(self, -1, pic3, pos=(190,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.OnSave, self.buttonSave)
                self.buttonSave.SetDefault()
                self.buttonSave.Disable()
                self.buttonSave.SetToolTipString('Enregistrer')
                self.sizerButton.Add(self.buttonSave, 1, wx.EXPAND)
         
                pic4=wx.Bitmap("img/close.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonClose=wx.BitmapButton(self, -1, pic4, pos=(280,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.OnClose, self.buttonClose)
                self.buttonClose.SetDefault()
                self.buttonClose.Disable()
                self.buttonClose.SetToolTipString('Fermer')
                self.sizerButton.Add(self.buttonClose, 1, wx.EXPAND)
         
                pic5=wx.Bitmap("img/new_param.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonNewParam=wx.BitmapButton(self, -1, pic5, pos=(400,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.Add, self.buttonNewParam)
                self.buttonNewParam.SetDefault()
                self.buttonNewParam.Disable()
                self.buttonNewParam.SetToolTipString('Ajouter une ligne')
                self.sizerButton.Add(self.buttonNewParam, 1, wx.EXPAND)
         
                pic6=wx.Bitmap("img/del_param.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonDellParam=wx.BitmapButton(self, -1, pic6, pos=(490,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.Dell, self.buttonDellParam)
                self.buttonDellParam.SetDefault()
                self.buttonDellParam.Disable()
                self.buttonDellParam.SetToolTipString('Supprimer la/les ligne(s)')
                self.sizerButton.Add(self.buttonDellParam, 1, wx.EXPAND)
         
                pic6=wx.Bitmap("img/help.png", \
                    wx.BITMAP_TYPE_ANY)#.ConvertToBitmap()
                self.buttonHelp=wx.BitmapButton(self, -1, pic6, pos=(1170,10), size = (80,70))
                self.Bind(wx.EVT_BUTTON, self.Help, self.buttonHelp)
                self.buttonHelp.SetDefault()
                self.buttonHelp.SetToolTipString('Aide')
                self.sizerButton.Add(self.buttonHelp, 1, wx.EXPAND)
                ###################################################################
         
         
         
                ###################################################################
                ###                            Grille                           ###
                ###################################################################
                self.myGrid = gl.Grid(self)
                self.myGrid.CreateGrid(35, 7) 
                self.myGrid.EnableEditing(False)  
                self.myGrid.SetSelectionMode(self.myGrid.wxGridSelectRows)        
         
                self.myGrid.SetColLabelValue(0, "System parameter")
                self.myGrid.SetColLabelValue(1, "Value")
                self.myGrid.SetColLabelValue(2, "")
                self.myGrid.SetColLabelValue(3, "Minimum Value")
                self.myGrid.SetColLabelValue(4, "Maximum Value")
                self.myGrid.SetColLabelValue(5, "Resolution")
                self.myGrid.SetColLabelValue(6, "Unit")
         
                self.myGrid.AutoSize()
                ###################################################################
         
         
         
                self.sizerGeneral = wx.BoxSizer(wx.VERTICAL)
                self.sizerGeneral.Add(self.sizerButton, 0, wx.EXPAND)
                self.sizerGeneral.Add(self.myGrid, 1, wx.EXPAND)
                self.SetSizer(self.sizerGeneral)
                self.SetAutoLayout(1)
                self.sizerGeneral.Fit(self)
         
         
                self.Show(True)
         
            def OnSize(self, evt):
                evt.Skip()
                self.Reposition() 
                self.m_sizeChanged = True
         
            def OnIdle(self, evt):
                if self.m_sizeChanged:
                    self.Reposition()  
         
            def Reposition(self):
                # première zone de texte
                rect1 = self.sb.GetFieldRect(1)
                rect1.x += 150
                rect1.y += 0
                self.sb.t1.SetRect(rect1)
                widthRect1 = rect1.GetSize().width - 155
                self.sb.t1.SetSize(size= (widthRect1,-1))
         
                # seconde zone de texte
                rect2 = self.sb.GetFieldRect(2)
                rect2.x += 65
                rect2.y += 0
                self.sb.t2.SetRect(rect2)
                widthRect2 = rect2.GetSize().width - 70
                self.sb.t2.SetSize(size= (widthRect2,-1))
         
                self.m_sizeChanged = False    
         
         
        if __name__ == "__main__":
            app = wx.App()
            frame = IhmGenerale(None,-1,'my application')
            app.MainLoop()

        J'ai masqué les events inutiles pour l'exemple.

        • Partager sur Facebook
        • Partager sur Twitter

        [wxPython] Problème de focus sur IHM

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown