IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Fenêtre wx Python


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    DAF
    Inscrit en
    Août 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : DAF
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2020
    Messages : 12
    Par défaut Fenêtre wx Python
    Bonjour,

    je débute avec wxPython, ce n'est que mon deuxième programme avec (et le premier où j'essaie d'intégrer une grille type Excel).
    J'utilise PyCharm et Python 3.9.1
    Je voulais me créer un petit programme utile pour le boulot mais à peine commencé je galère avec une histoire de re-dimensionnement de fenêtre.
    Pour info, par habitude, j'écris mes classes dans des fichiers séparés (je trouve que cela fait moins fouilli).

    J'ai commencé à écrire l'embryon de code suivant:

    main.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import wx
    import Frame.winmain as itf
     
     
    def main():
        app = wx.App()
        frame = itf.MainInterface(parent=None, index=-1)
     
        frame.Show()
        app.MainLoop()
     
     
    if __name__ == "__main__":
        main()
    winmain.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import wx
     
    from pathlib import Path
    from Frame.menu import MyMenu
    from Frame.grid import MyGrid
     
     
    class MainInterface(wx.Frame):
        """Notre fenêtre principale qui hérite de Frame
        """
     
        def __init__(self, parent, index):
            wx.Frame.__init__(self, parent, title='FAR et AAR', id=index,  size=(830, 750),
                              style=wx.DEFAULT_FRAME_STYLE)
     
            self.CentreOnScreen()
            self.init_ui()
     
        def init_ui(self):
            self.pnl = wx.Panel(self)
     
            self.menu = MyMenu()
            self.Bind(wx.EVT_MENU, self.on_quit, self.menu.quitter)
            self.SetMenuBar(self.menu)
     
            self.CreateStatusBar()
     
            self.grille_import = MyGrid(self.pnl, nb_col=12, nb_li=55000)
     
            sizer1 = wx.BoxSizer(wx.VERTICAL)
            sizer1.Add(self.grille_import, wx.EXPAND)
     
            self.pnl.SetSizerAndFit(sizer1)
     
        def on_quit(self, event):
            self.Close()
    grid.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import wx
    import wx.grid
     
     
    class MyGrid(wx.grid.Grid):
     
        def __init__(self, parent, nb_col, nb_li):
            wx.grid.Grid.__init__(self)
     
            self.nb_col = nb_col
            self.nb_li = nb_li
     
            self.tableau = wx.grid.Grid(parent, -1)
            self.tableau.CreateGrid(self.nb_li, self.nb_col)
            self.tableau.SetSize(830, 750)
    menu.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import wx
     
     
    class MyMenu(wx.MenuBar):
        """Classe de la barre de menu du programme"""
     
        def __init__(self):
            wx.MenuBar.__init__(self)
     
            self.fichier = wx.Menu()
            self.sep = self.fichier.AppendSeparator()
            self.ouvrir = wx.MenuItem(self.fichier, wx.ID_OPEN, "&Ouvrir\tCtrl+O", "Ouvrir un fichier")
            self.quitter = wx.MenuItem(self.fichier, wx.ID_EXIT, "&Quitter\tCtrl+Q", "Quitter l'application")
     
            list_opt = [self.ouvrir, self.sep, self.quitter]
            for elt in list_opt:
                self.fichier.Append(elt)
     
            self.Append(menu=self.fichier, title="&Fichier")
    J'ai donc deux problèmes que je n'arrive pas à résoudre malgré mes différentes recherches et les différents essais que j'ai effectué.

    1er problème: la grid que j'ai instancié sous le nom self.grille_import et qui est insérée dans le sizer1 avec le flag wx.EXPAND, ben quand j'agrandi ma fenêtre la grid reste exactement à la même taille. Elle ne s'adapte pas à taille de mon Frame.
    J'ai tenté plein de trucs différents, avec et sans sizer mais rien n'y fait. Je n'arrive pas à voir pourquoi la taille reste fixe.
    Dans la classe MyGrid au début je ne définissais pas de taille du tout et c'était encore pire car je n'obtenais qu'une mini-grid où on voyait seulement les barres de défilement.

    2ème problème: quand j'utilise ma méthode on_quit pour fermer mon programme, PyCharm me retourne le code erreur: Process finished with exit code -1073741819 (0xC0000005).
    Alors que sur un autre programme que j'ai fait avec la même méthode, je n'ai pas ce problème.
    Là aussi après des recherches sur le net je n'ai pas réussi à trouver de solution qui fonctionne, je n'arrive pas à savoir à quoi cela est dû.

    Si quelqu'un pouvait se pencher sur mon problème qui ne doit pas être grand chose mais qui me fait tourner en bourrique, je lui en serais très reconnaissant.

    Merci beaucoup

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 206
    Par défaut
    hello,
    en faisant comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        def init_ui(self):        
            self.pnl = wx.Panel(self)
     
            self.menu = MyMenu()
            self.Bind(wx.EVT_MENU, self.on_quit, self.menu.quitter)
            self.SetMenuBar(self.menu)
     
            self.CreateStatusBar()
            self.grille_import = wx.grid.Grid(self.pnl)
            self.grille_import.CreateGrid( 55000, 12)   
            sizer2 = wx.BoxSizer(wx.VERTICAL)
            sizer2.Add(self.grille_import,0,  wx.EXPAND|wx.ALL , 2)
            self.pnl.SetSizerAndFit(sizer2)
    le redimensionnement semble correct.

    Ami calmant, J.P

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je ne connais pas WX, mais je vois ceci: dans MyGrid qui est une wx.grid.Grid tu crées une autre wx.grid.Grid du nom de tableau et qui reçoit le même parent que MyGrid.

    Je soupçonne donc une confusion de Grid et celle qui refuse de suivre le redimensionnement n'est pas celle que tu penses.

    Aussi ici: self.CentreOnScreen() ne serait pas plutôt self.CenterOnScreen() ?

  4. #4
    Membre averti
    Homme Profil pro
    DAF
    Inscrit en
    Août 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : DAF
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2020
    Messages : 12
    Par défaut
    Bonjour,

    merci à vous, grâce à vos deux réponses j'ai compris effectivement d'où venait mon erreur.

    Dans MyGrid je faisais effectivement un doublon en re-créant une autre grid.
    Du coup j'ai modifié la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import wx
    import wx.grid
     
     
    class MyGrid(wx.grid.Grid):
     
        def __init__(self, parent, nb_col, nb_li):
            wx.grid.Grid.__init__(self, parent)
     
            self.nb_col = nb_col
            self.nb_li = nb_li
     
     
            self.CreateGrid(self.nb_li, self.nb_col)
            self.SetSize(830, 750)
    et l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def init_ui(self):
            self.pnl = wx.Panel(self)
            self.grille_import = MyGrid(self.pnl, nb_col=12, nb_li=55000)
     
            sizer1 = wx.BoxSizer(wx.VERTICAL)
            sizer1.Add(self.grille_import, 0, wx.EXPAND)
     
            self.pnl.SetSizerAndFit(sizer1)
    Et maintenant le re-dimensionnement fonctionne.

    Me reste plus qu'à trouver l'origine de mon code erreur à la fermeture.

    Merci beaucoup.

Discussions similaires

  1. multi fenêtres en python
    Par bern59 dans le forum Tkinter
    Réponses: 9
    Dernier message: 31/08/2017, 12h42
  2. Réponses: 2
    Dernier message: 14/07/2017, 01h11
  3. Réponses: 4
    Dernier message: 20/04/2011, 11h20
  4. Insérer une fenêtre Python dans un canevas Tcl
    Par astro824 dans le forum Tkinter
    Réponses: 0
    Dernier message: 13/07/2010, 15h28
  5. insérer un icone dans la fenêtre python 3
    Par Petugnia dans le forum Tkinter
    Réponses: 3
    Dernier message: 08/06/2009, 08h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo