Partage
  • Partager sur Facebook
  • Partager sur Twitter

wxpython notebook

    29 décembre 2023 à 17:23:20

    Bonjour,

    J'ai commencé un outil en python avec la bibliothèque graphique wx (wxpython) j'ai créé un splitter afin d'avoir deux widgets modulables.

    Sur le splitter du haut j'ai un tableau et sur le splitter du bas j'ai réussi à ajouter le notebook.

    mon soucis c'est que j'aimerai pouvoir crée un nouvelle onglet (new tab) depuis un boutton ou via le menu (Menu > New Tab), comment puis-je faire s'il vous plait ?

    Merci

    Cordialement

    Voici mon code

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    ### Multithread
    import threading
    ### Disable Warning
    import warnings
    warnings.filterwarnings("ignore")
    #File Configuration
    import configparser
    # GUI Lib
    import wx
    # For notifymsg 
    import wx.adv
    # Divers
    import sys, requests, os
    
    
    class SxS(wx.Frame):
        def __init__(self,titre):
            wx.Frame.__init__(self, None, wx.ID_ANY, title = titre, size = (1400,750))
            self.SetSize(0,0,1400,750)
            # Add StatusBar
            self.sb = self.CreateStatusBar()
            # menu
            menuBar = wx.MenuBar()
            # create the File menu
            FileMenu = wx.Menu()                
            FileMenu.Append(101, "&New File", "")
            FileMenu.Append(102, "&New Tab", "")
            FileMenu.Append(103, "&Options", "")
            FileMenu.Append(104, "&Exit", "")
            self.Bind(wx.EVT_MENU, self.OnNew1, id=101)
            self.Bind(wx.EVT_MENU, self.OnNew2, id=102)
            self.Bind(wx.EVT_MENU, self.OnQuit, id=104)
            # add a Option to a menu
            optMenu = wx.Menu()
            itemmenu = wx.MenuItem(optMenu, wx.ID_ANY, "Options", "")
            optMenu.Append(itemmenu)
            # add menus to menubar
            # add a Help to a menu
            HelpMenu = wx.Menu()
            itemhelp = wx.MenuItem(optMenu, wx.ID_ANY, "Help", "")
            HelpMenu.Append(itemhelp) #AppendItem
            # add menus to menubar
            menuBar.Append(FileMenu, "&File")
            menuBar.Append(optMenu, "&Options")
            menuBar.Append(HelpMenu, "&Help")
            self.SetMenuBar(menuBar)
            # End menubar
            # Add Splitter
            splitter = wx.SplitterWindow(self)
            leftP = Panel_haut(splitter)
            rightP = Panel_bas(splitter)
            # split the window
            splitter.SplitHorizontally(leftP, rightP)
            splitter.SetMinimumPaneSize(200)
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(splitter, 1, wx.EXPAND)
            self.SetSizer(sizer)
    
    
            # Update StatusBar
            self.sb.SetStatusText('Username admin')
            self.Show()
    
    
        def OnNew1(self, e):
            pass
    
        def OnNew2(self, e):
            pass
    
        def OnPress(self, e):
           pass
    
        def OnQuit(self, e):
            self.Close()
    
    class Panel_haut(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent)
            # Add tableview
            index = 0
            list_ctrl = wx.ListCtrl(self, size=(-1, 200),style=wx.LC_REPORT | wx.BORDER_SUNKEN)
            list_ctrl.InsertColumn(0, 'ID', width=65)
            list_ctrl.InsertColumn(1, 'Username', width=160)
            list_ctrl.InsertColumn(2, 'Pseudo', width=160)
            self.mainSizer = wx.BoxSizer(wx.VERTICAL)
            self.mainSizer.Add(list_ctrl, 1, wx.EXPAND|wx.ALL| wx.GROW)
            self.SetSizer(self.mainSizer)
    
    class Panel_bas(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent)
            self.notebook = wx.Notebook(self)
            tabOne = TabPanel(self.notebook)
            self.notebook.AddPage(tabOne, "Tab 1")
            tabTwo = TabPanel(self.notebook)
            self.notebook.AddPage(tabTwo, "Tab 2")
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.notebook, 1, wx.ALL|wx.EXPAND, 5)
            self.SetSizer(sizer)
            self.Layout()
            
            self.Show()
    
    class TabPanel(wx.Panel):
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent)
            self.textCtrl1 = wx.TextCtrl(id=wx.ID_ANY,parent=self, pos=wx.Point(5, 5), size=wx.Size(1375, 360), style=wx.VSCROLL | wx.TE_MULTILINE | wx.ALL | wx.EXPAND)
            self.textCtrl1.SetForegroundColour(wx.WHITE)
            self.textCtrl1.AppendText("\nBienvenue\n")
            self.textCtrl1.SetEditable(False) 
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.textCtrl1, 1, wx.ALL|wx.EXPAND, 5)
            self.SetSizer(sizer)
    
    
    
    def main():
        screen_app = wx.App()
        SxS('Menu')
        screen_app.MainLoop() 
    
    main()



    -
    Edité par david009 29 décembre 2023 à 17:24:39

    • Partager sur Facebook
    • Partager sur Twitter
      29 décembre 2023 à 18:48:10

      rightP = Panel_bas(splitter)

      ce genre de ligne va poser problème, car dans l'utilisation de vos méthodes de classe, vous ne pourrez pas faire référence à l'attribut rightP.

      Pour résoudre ce problème, il faudra écrire : self.rightP = Panel_bas(splitter) (note l'ajout de self)

      Après possiblement vous pourrez compléter OnNew2

      def OnNew2(self, e):
          new_tab = TabPanel(self.rightP.notebook)
          self.rightP.notebook.AddPage(new_tab, "New Tab")
      

      Lorsque l'utilisateur sélectionne NewTab dans le menu, on devrait voir apparaître un nouvel onglet.

      à tester, mais le problème dans votre code c'est que les attributs de votre classe ne sont pas utilisables sans les référencer (ajout de self) afin de les utiliser dans vos méthodes de la classe SxS.

      -
      Edité par fred1599 29 décembre 2023 à 18:49:50

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        29 décembre 2023 à 19:24:16

        Bonjour,

        Merci effectivement cela fonctionne mieux.

        Une derniere question si je souhaite ouvrir un nouveau TAB depuis une autre class c'est possible aussi ?

        Un grand merci pour ton retour.

        Cordialement

        -
        Edité par david009 29 décembre 2023 à 19:30:19

        • Partager sur Facebook
        • Partager sur Twitter
          29 décembre 2023 à 20:35:41

          david009 a écrit:

          Une derniere question si je souhaite ouvrir un nouveau TAB depuis une autre class c'est possible aussi ?

          Question pas très claire et purement technique. La réponse rapide est que tout est possible...

          Une classe pour faire quoi ? Qui hériterait de ? On crée des classes car on souhaite implémenter la création d'objets.

          On pourrait par exemple créer un manager de Notebook.

          class NotebookManager:
              def __init__(self, notebook):
                  self.notebook = notebook
          
              def add_new_tab(self, tab_title="New Tab"):
                  new_tab = TabPanel(self.notebook)
                  self.notebook.AddPage(new_tab, tab_title)
          

          On se concentre uniquement sur la gestion des onglets. On sépare les responsabilités et on peut utiliser cette classe dans Panel_bas.

          Mais tout cela demande une bonne maîtrise technique du langage et surtout une excellente modélisation sur l'ensemble du projet.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            29 décembre 2023 à 20:55:20

            Bonjour, merci beaucoup pour vos réponse 🙏

            Je vais continuer d'apprendre le langage je pense effectivement qui me manque des notions.

            Merci beaucoup.

            • Partager sur Facebook
            • Partager sur Twitter

            wxpython notebook

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown