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é
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).
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.
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 ?
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.
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.
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.
J'ai la bonne piste, je vais essayé depuis le cours. Mais le principal est d'avoir une piste
Merci
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.
Blond, bouclé, toujours le sourire aux lèvres...
Blond, bouclé, toujours le sourire aux lèvres...