Partage
  • Partager sur Facebook
  • Partager sur Twitter

Class, return et list

Il ne se passe rien !

Sujet résolu
    14 août 2019 à 17:22:01

    Bonjour,

    Voila donc un nouveau sujet.

    J'ai fait un petit bout de code qui fonctionne dans une classe :

    class SearchPortCom:
        comList = list(listPort.comports())
        connectedCom = []
        for port, desc, hwid in sorted(comList):
            connectedCom.extend([[port, desc, hwid]])
    
        print("Connected COM ports:" + str(connectedCom))
        print(connectedCom[1][0])

    J'obtiens le résultat suivant :

    Connected COM ports:[['COM1', 'Port de communication (COM1)', 'ACPI\\PNP0501\\1'], ['COM4', 'USB-SERIAL CH340 (COM4)', 'USB VID:PID=1A86:7523 SER=6 LOCATION=1-1.1']]

    J'ai ensuite essayé de faire un return, mais ça ne fonctionne pas du tout.

    Comment donc ma classe pourrait renvoyer un return avec, soit un tableau entier mais c'est moyen et ça prend beaucoup de ressource, soit on cherche l'info à la demande et à ce moment, ça ne retourne que l'information que l'on veut.

    Le but ensuite, c'est d'affecter dans une ListBox les infos suivant:

    • 'COM1', 'Port de communication (COM1)', 'ACPI\\PNP0501\\1' -> retournera COM1 si sélectionné
    • 'COM4', 'USB-SERIAL CH340 (COM4)', 'USB VID:PID=1A86:7523 SER=6 LOCATION=1-1.1' -> retournera COM4 si sélectionné

    Merci




    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2019 à 17:34:37

      Caxton a écrit:

      Comment donc ma classe pourrait renvoyer un return avec, soit un tableau entier mais c'est moyen et ça prend beaucoup de ressource, soit on cherche l'info à la demande et à ce moment, ça ne retourne que l'information que l'on veut.

      Votre code est exécuté lors de la définition de la classe. Et si la classe n'existe pas encore, elle ne peut rien retourner (à quel appelant?). Pourquoi ne pas créer une fonction (ou une méthode) qui elle (peut) retourner quelque chose.

      Ah... j'oubliais, si la fonction retourne un tableau, c'est juste l'adresse du tableau (une référence) et non une copie de celui ci: çà ne prend pas beaucoup de ressource (mémoire).

      -
      Edité par mps 14 août 2019 à 19:09:18

      • Partager sur Facebook
      • Partager sur Twitter
        14 août 2019 à 20:07:07

        Bon, si je comprends bien, il faut le code complet :(...

        import tkinter as tk
        import serial
        import serial.tools.list_ports as listPort
        # Variable custom
        vers = "1.0"
        name = "Test TKINTER"
        
        # Menu Bar
        class MenuBar(tk.Menu):
            def __init__(self, parent):
                tk.Menu.__init__(self, parent)
        
                # Menu bar File
                fileMenu = tk.Menu(self, tearoff=0)
                fileMenu.add_command(label="Open")
                fileMenu.add_command(label="Save")
                fileMenu.add_command(label="Save as")
                fileMenu.add_separator()
                fileMenu.add_command(label="Exit")
                self.add_cascade(label="File", menu=fileMenu)
        
                # Menu bar Infos
                infoMenu = tk.Menu(self, tearoff=0)
                infoMenu.add_command(label="Site")
                infoMenu.add_command(label="Version")
                self.add_cascade(label="Informations", menu=infoMenu)
        
        # Editor
        class Editor(tk.LabelFrame):
            def __init__(self, parent, **kwargs):
                super().__init__(parent, **kwargs)
        
                self.config(text='Editor')
        
                # Scroll
                scroll_Editor_Y = tk.Scrollbar(self, orient="vertical")
                scroll_Editor_Y.grid(row=0, column=1, sticky=tk.NS, padx=5, pady=5)
        
                scroll_Editor_X = tk.Scrollbar(self, orient="horizontal")
                scroll_Editor_X.grid(row=1, column=0, sticky=tk.EW, padx=5, pady=5)
        
                # Edit Text
                editText = tk.Text(self, bg='black', fg='green')
                editText.config(wrap=tk.NONE)
                editText.config(height=10, width=50)
                editText.config(insertbackground='green')
                editText.config(yscrollcommand=scroll_Editor_Y.set)
                editText.config(xscrollcommand=scroll_Editor_X.set)
                editText.grid(row=0, column=0, sticky=tk.NSEW, padx=5, pady=5)
        
                # Scroll modify by text position
                scroll_Editor_Y.config(command=editText.yview)
                scroll_Editor_X.config(command=editText.xview)
        
        # Buttons Editor
        class ButtonsEditor(tk.LabelFrame):
            def __init__(self, parent, **kwargs):
                super().__init__(parent, **kwargs)
        
                self.config(text='Editor options')
        
                buttonTest = tk.Button(self, text="Test 2")
                buttonTest.grid(row=0, column=0, sticky=tk.NSEW, padx=5, pady=5)
        
        # Serial Communication
        class SerialComm(tk.LabelFrame):
            def __init__(self, parent, **kwargs):
                super().__init__(parent, **kwargs)
        
                self.config(text='Serial')
        
                textSend = tk.Entry(self, bg='black', fg='green')
                textSend.config(insertbackground='green')
                textSend.grid(row=0, column=0, sticky=tk.NSEW, padx=5, pady=5)
                self.grid_rowconfigure(0, weight=0)
                self.grid_columnconfigure(0, weight=1)
        
                buttonSend = tk.Button(self, text="Send")
                buttonSend.config(height = 1, width = 10)
                buttonSend.grid(row=0, column=1, sticky=tk.NSEW, padx=5, pady=5)
                self.grid_rowconfigure(0, weight=0)
                self.grid_columnconfigure(1, weight=0)
        
                # Scroll
                scroll_Send_Y = tk.Scrollbar(self, orient="vertical")
                scroll_Send_Y.grid(row=1, column=1, sticky=tk.NS, padx=5, pady=5)
                self.grid_rowconfigure(1, weight=100)
                self.grid_columnconfigure(1, weight=0)
        
                scroll_Send_X = tk.Scrollbar(self, orient="horizontal")
                scroll_Send_X.grid(row=2, column=0, columnspan=2, sticky=tk.EW, padx=5, pady=5)
                self.grid_rowconfigure(2, weight=1)
                self.grid_columnconfigure(0, weight=1)
        
                # Edit Text
                serialText = tk.Text(self, bg='black', fg='green')
                serialText.config(wrap=tk.NONE)
                serialText.config(height=10, width=50)
                serialText.config(insertbackground='green')
                serialText.config(yscrollcommand=scroll_Send_Y.set)
                serialText.config(xscrollcommand=scroll_Send_X.set)
                serialText.grid(row=1, column=0, sticky=tk.NSEW, padx=5, pady=5)
                self.grid_rowconfigure(1, weight=100)
                self.grid_columnconfigure(0, weight=1)
        
                # Scroll modify by text position
                scroll_Send_Y.config(command=serialText.yview)
                scroll_Send_X.config(command=serialText.xview)
        
        # Buttons Serial Communication
        class ButtonsSerialComm(tk.LabelFrame):
            def __init__(self, parent, **kwargs):
                super().__init__(parent, **kwargs)
        
                self.config(text='Serial connection')
        
                availableCom = SearchPortCom()
                print(availableCom)
        # Buttons Serial
        class ButtonsSerial(tk.LabelFrame):
            def __init__(self, parent, **kwargs):
                super().__init__(parent, **kwargs)
        
                self.config(text='Serial option')
        
                buttonTest = tk.Button(self, text="Test 5")
                buttonTest.grid(row=0, column=0, sticky=tk.NSEW, padx=5, pady=5)
        
        # class search port com
        class SearchPortCom:
            def __init__(self):
                comList = list(listPort.comports())
                self.connectedCom = []
                for port, desc, hwid in sorted(comList):
                    self.connectedCom.extend([[port, desc, hwid]])
        
            def f(self):
                return self.connectedCom
        
        # Application
        class Application(tk.Tk):
            def __init__(self):
                super().__init__()
        
                # Disp menu bar
                menuBar = MenuBar(self)
                self.config(menu=menuBar)
        
                # Editor
                editor = Editor(self)
                editor.grid_rowconfigure(0, weight=1)                           # Stretch of widget
                editor.grid_columnconfigure(0, weight=1)                        # Stretch of widget
                editor.grid(row=0, column=0, sticky=tk.NSEW, padx=5, pady=5)    # Position of widget
                self.grid_rowconfigure(0, weight=2)                             # Proportion of widget row
                self.grid_columnconfigure(0, weight=2)                          # Proportion of widget col
        
                # Buttons editor
                buttonsEditor = ButtonsEditor(self)
                buttonsEditor.grid_rowconfigure(0, weight=1)                            # Stretch of widget
                buttonsEditor.grid_columnconfigure(0, weight=1)                         # Stretch of widget
                buttonsEditor.grid(row=0, column=1, sticky=tk.NSEW, padx=5, pady=5)     # Position of widget
                self.grid_rowconfigure(0, weight=2)                                     # Proportion of widget row
                self.grid_columnconfigure(1, weight=1)                                  # Proportion of widget col
        
                # Serial communication
                serialComm = SerialComm(self)
                serialComm.grid_rowconfigure(0, weight=1)                               # Stretch of widget
                serialComm.grid_columnconfigure(0, weight=1)                            # Stretch of widget
                serialComm.grid(row=1, column=0, rowspan=2, sticky=tk.NSEW, padx=5, pady=5)        # Position of widget
                self.grid_rowconfigure(1, weight=2)                                     # Proportion of widget row
                self.grid_columnconfigure(0, weight=2)                                  # Proportion of widget col
        
                # Buttons serial communication
                buttonsSerialComm = ButtonsSerialComm(self)
                buttonsSerialComm.grid_rowconfigure(0, weight=1)                            # Stretch of widget
                buttonsSerialComm.grid_columnconfigure(0, weight=1)                         # Stretch of widget
                buttonsSerialComm.grid(row=1, column=1, sticky=tk.NSEW, padx=5, pady=5)     # Position of widget
                self.grid_rowconfigure(1, weight=2)                                         # Proportion of widget row
                self.grid_columnconfigure(1, weight=1)                                      # Proportion of widget col
        
                # Buttons serial communication
                buttonsSerial = ButtonsSerial(self)
                buttonsSerial.grid_rowconfigure(0, weight=1)  # Stretch of widget
                buttonsSerial.grid_columnconfigure(0, weight=1)  # Stretch of widget
                buttonsSerial.grid(row=2, column=1, sticky=tk.NSEW, padx=5, pady=5)  # Position of widget
                self.grid_rowconfigure(2, weight=2)  # Proportion of widget row
                self.grid_columnconfigure(1, weight=1)  # Proportion of widget col
        
        # Main
        def main():
            app = Application()
            app.grid_columnconfigure(0, weight=1)
            app.grid_rowconfigure(0, weight=1)
        
            app.title(name + " - V " + vers)
            app.resizable(True, True)
            app.geometry("800x480+100+20")
            app.minsize(800, 480)
            app.mainloop()
        
        # Select
        if __name__ == "__main__":
            main()
        

        Donc, dans l'idée, ça devrais fonctionner puisque j'appelle la classe avant de placer le résultat dans une variable... :-°

        J'ai regarder quelques exemples mais je n'ai pas compris leurs intégration dans mon code actuel. Un exemple basé sur ce que j'ai déjà codé devrais me permettre d'y voir plus clair. Et il ne faut pas hésiter à me reprendre car, biejn que ça fasse le taf, je suis sûr que c'est améliorable. :)

        • Partager sur Facebook
        • Partager sur Twitter
          14 août 2019 à 20:28:50

          La méthode __init__ s'exécute à la création de l'objet, et elle n'a pas de return.

          D'ailleurs si tu veux juste exécuter quelques lignes et récupérer une liste, pourquoi créer une classe ? Une fonction suffirait tout en étant plus simple.

          Et à quoi sert la méthode f() de la classe, tu ne l'exécute jamais dans ton code ?

          -
          Edité par LoupSolitaire 14 août 2019 à 20:29:36

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            14 août 2019 à 20:40:55

            C'est ce que j'ai expliqué tout à l'heure pour ma classe et pour la méthode f().

            J'ai regardé des exemples, la méthode f() a été reprise pour tester. Mais après je ne suis pas arrivé à m'en servir correctement. :p

            C'est pour ça que j'ai poster ici ; pour y voir plus clair. Comprendre sur un exemple simple (quitte à refaire un fichier neuf rien que pour ça). D'ailleurs, ça me fais penser que, si je comprends bien :

            • Il me faut une instanciation de la classe. Je ne suis pas certain que mon availableCom = SearchPortCom() soit le cas.
            • Il me faut une utilisation des membres de la classe. Ce serais plutot availableCom = f() ou peut-être class.f().
            A ce stade, je préfère m'orienter vers un exemple pour comprendre avant de retravailler sur l'original. ;)

            Il ne faut pas avoir peur de se tromper et de tester, encore moins de reconnaître ses erreurs et faiblesses.

            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2019 à 20:49:11

              Euh, ce sont les bases de l'objet qui manquent là, le plus simple ce serait de lire un cours sur le sujet plutôt que de bricoler. Ça risque de finir par te frustrer plus qu'autre chose de tester des trucs au hasard.

              Pour répondre à tes deux points :

              Si, ce que tu fais est bien une instanciation. Appeler SearchPortCom() appelle automatiquement le constructeur (la méthode __init__()).

              Pour appeler une méthode d'un objet on l'instancie et on appelle la méthode comme ça :

              # instanciation de l'objet
              availableCom = SearchPortCom()
              # appel de méthode et récupération de la valeur de retour dans la variable result
              result = availableCom.f()

              Mais sérieusement, lis un cours sur les classes et les objets en Python, parce que là c'est n'importe quoi d'essayer en faisant des trucs complètement au hasard.

              • Partager sur Facebook
              • Partager sur Twitter

              Blond, bouclé, toujours le sourire aux lèvres...

                14 août 2019 à 21:46:01

                Ok !

                J'ai la bonne piste, je vais essayé depuis le cours. Mais le principal est d'avoir une piste :)

                Merci

                • Partager sur Facebook
                • Partager sur Twitter

                Class, return et list

                × 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