Demande de conseils découpage de code python

a marqué ce sujet comme résolu.

Bonjour

J’ai un script qui commence à grandir pas mal et je me pose la question de le découper (il y a déjà 4 fichiers : EssaiDeNotebook.py, Errors.py, style.css et EssaiDeNotebook.glade)

mon ficher se présente comme cela :

# import de la bibliothèque graphique
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk,Gdk
import os, sys
import Errors
from math import *

class EssaiDeNotebook:
    __gtype_name__ = "EssaiDeNotebook"

    def __init__(self):
        # en cas d'usage de PyInstaller pour créer un exe unique, il faut adapter le chemin du fichier glade
        if getattr(sys, 'frozen', False):
           wd = sys._MEIPASS
           print("bundle : path = ",wd)
        else:
           wd = os.getcwd()
           print("live : path = ",wd)
        file_path = os.path.join(wd,'EssaiDeNotebook.glade')
        style_provider = Gtk.CssProvider()
        css = open(wd+'\\'+'style.css', 'rb')
        css_data = css.read()
        css.close()
        style_provider.load_from_data(css_data)
        #path="{0}style.css".format(wd)
        #style_provider.load_from_file(path)
        interface = Gtk.Builder()

        interface.add_from_file(file_path)
        interface.connect_signals(self)
        window = interface.get_object("window")
        SC=Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), style_provider,
                                                       Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        self.statusbar = interface.get_object('statusbar')
        self.notebook = interface.get_object("notebook1")
        self.on_notebook_switchpage(self.notebook, '', 0)
        # volet calcul de coussinet
        self.cs_effort= interface.get_object("cs_effort_radial")
        self.cs_dia = interface.get_object("cs_dia")
        self.cs_long = interface.get_object("cs_long")
        self.cs_freq = interface.get_object("cs_freq")
        self.cs_pression=interface.get_object("cs_label_p")
        self.cs_pv = interface.get_object("cs_label_pv")
        self.cs_vitesse = interface.get_object("cs_label_vitesse")

        self.cs_bouton= interface.get_object("cs_bt_calc")

        window.show_all()

    # Lien avec glade : notebook1 / signaux / GTKnoteBook/ switch-page -> on_notebook_switchpage
    def on_notebook_switchpage(self, notebook, page, page_num, data=None):
        self.tab = notebook.get_nth_page(page_num)
        self.label = notebook.get_tab_label(self.tab).get_label()
        print(self.label)
        self.message_id = self.statusbar.push(0, self.label)

    def cs_bt_calc_clicked(self,widget):
        erreur=0
        N=self.cs_effort.get_text()
        if not Errors.is_numeric(N):
            Errors.MessageErreur(); erreur += 1
        dia=self.cs_dia.get_text()
        if not Errors.is_numeric(dia):
            Errors.MessageErreur(); erreur += 1
        else:
            if dia=="0":
                Errors.MessageErreurZero(); erreur=erreur+1
        long = self.cs_long.get_text()
        if not Errors.is_numeric(long):
            Errors.MessageErreur(); erreur += 1
        else:
            if long=="0":
                Errors.MessageErreurZero(); erreur=erreur+1
        freq = self.cs_freq.get_text()
        if not Errors.is_numeric(freq):
            Errors.MessageErreur(); erreur += 1
        if erreur<=0:
            pression = float(N)/(float(dia)*float(long))
            vitesse = float(dia)*pi*float(freq)/60000
            pv=pression*vitesse
            self.cs_vitesse.set_label(str(vitesse))
            self.cs_pression.set_label(str(pression))
            self.cs_pv.set_label(str(pv))
        print("Effort =",N," - Diàmétre =",dia," - long =",long," - Freq=",freq)

    # Lien avec glade : windows / signaux / GtkWidget / widget / destroy -> destroy
    def destroy(self, widget):
        print("Au Revoir !")
        Gtk.main_quit()

if __name__ == "__main__":
    app = EssaiDeNotebook()
    Gtk.main()

Je voudrais le découper en 2 parties ou plus, est-il possibel de mettre la zone a partir de

def cs_bt_calc_clicked

dans un autre fichier ?

Merci d’avance

+0 -0

Salut,

est-il possible de mettre la zone a partir de def cs_bt_calc_clicked ?

Il n’est pas possible de découper tel quel un objet en deux fichiers, par contre ce qui est faisable c’est de mettre des fonctions dans un fichier et de les importer.

Je ne trouve pas que ton fichier soit trop grand, par contre je pense que tu pourrais le rendre plus lisible en sautant des lignes de temps en temps et en prenant soin de mettre des espaces autour des opérateurs ==, =, *, etc. N’hésites pas à jeter un œil aux recommandations de la PEP 8 et de la PEP 20. Tu peux même installer l’outil autopep8 pour automatiser ça.

Aussi, au lieu d’écrire :

else:
    if long=="0":
        Errors.MessageErreurZero(); erreur=erreur+1

tu peux écrire :

elif long=="0":
    Errors.MessageErreurZero(); erreur=erreur+1
+1 -0

Bonsoir

Je me repond à moi même j’arrive miraculeusement à ça. Et ça marche, par contre je ne me l’explique pas !

# import de la bibliothèque graphique
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk,Gdk
import os, sys
import Errors
import VerifCoussinet
from math import *

class EssaiDeNotebook:
    __gtype_name__ = "EssaiDeNotebook"

    def __init__(self):
        # en cas d'usage de PyInstaller pour créer un exe unique, il faut adapter le chemin du fichier glade
        if getattr(sys, 'frozen', False):
           wd = sys._MEIPASS
           print("bundle : path = ",wd)
        else:
           wd = os.getcwd()
           print("live : path = ",wd)
        file_path = os.path.join(wd,'EssaiDeNotebook.glade')
        style_provider = Gtk.CssProvider()
        css = open(wd+'\\'+'style.css', 'rb')
        css_data = css.read()
        css.close()
        style_provider.load_from_data(css_data)
        #path="{0}style.css".format(wd)
        #style_provider.load_from_file(path)
        interface = Gtk.Builder()

        interface.add_from_file(file_path)
        interface.connect_signals(self)
        window = interface.get_object("window")
        SC=Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), style_provider,
                                                       Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        self.statusbar = interface.get_object('statusbar')
        self.notebook = interface.get_object("notebook1")
        self.on_notebook_switchpage(self.notebook, '', 0)
        # volet calcul de coussinet
        self.cs_effort= interface.get_object("cs_effort_radial")
        self.cs_dia = interface.get_object("cs_dia")
        self.cs_long = interface.get_object("cs_long")
        self.cs_freq = interface.get_object("cs_freq")
        self.cs_pression=interface.get_object("cs_label_p")
        self.cs_pv = interface.get_object("cs_label_pv")
        self.cs_vitesse = interface.get_object("cs_label_vitesse")

        self.cs_bouton= interface.get_object("cs_bt_calc")

        window.show_all()

    # Lien avec glade : notebook1 / signaux / GTKnoteBook/ switch-page -> on_notebook_switchpage
    def on_notebook_switchpage(self, notebook, page, page_num, data=None):
        self.tab = notebook.get_nth_page(page_num)
        self.label = notebook.get_tab_label(self.tab).get_label()
        print(self.label)
        self.message_id = self.statusbar.push(0, self.label)

    # lien avec glade : cs_bt_calc (bouton) / Signaux / GtkButton / clicked -> cs_bt_calc_clicked
    def cs_bt_calc_clicked(self,widget):
        VerifCoussinet.Calcul(self)
    # Lien avec glade : windows / signaux / GtkWidget / widget / destroy -> destroy
    def destroy(self, widget):
        print("Au Revoir !")
        Gtk.main_quit()

if __name__ == "__main__":
    app = EssaiDeNotebook()
    Gtk.main()

et dans le fichier VerifCoussinet.py

import gi
import Errors
from math import *

def Calcul(self):
    erreur=0
    N=self.cs_effort.get_text()
    if erreur==0:
        if not Errors.is_numeric(N):
            Errors.MessageErreur(); erreur += 1
        dia=self.cs_dia.get_text()
        if not Errors.is_numeric(dia):
            Errors.MessageErreur(); erreur += 1
        else:
            if dia=="0":
                Errors.MessageErreurZero(); erreur=erreur+1
        long = self.cs_long.get_text()
        if not Errors.is_numeric(long):
            Errors.MessageErreur(); erreur += 1
        else:
            if long=="0":
                Errors.MessageErreurZero(); erreur=erreur+1
        freq = self.cs_freq.get_text()
        if not Errors.is_numeric(freq):
            Errors.MessageErreur(); erreur += 1
        if erreur<=0:
            pression = float(N)/(float(dia)*float(long))
            vitesse = float(dia)*pi*float(freq)/60000
            pv=pression*vitesse
            self.cs_vitesse.set_label(str(vitesse))
            self.cs_pression.set_label(str(pression))
            self.cs_pv.set_label(str(pv))
        print("Effort =",N," - Diàmétre =",dia," - long =",long," - Freq=",freq)

Ce n’est peut-être pas très propre et cela peut s’améliorer sans doute je prend volontiers toutes les remarques

Salut,

est-il possible de mettre la zone a partir de def cs_bt_calc_clicked ?

Il n’est pas possible de découper tel quel un objet en deux fichiers, par contre ce qui est faisable c’est de mettre des fonctions dans un fichier et de les importer.

Je ne trouve pas que ton fichier soit trop grand, par contre je pense que tu pourrais le rendre plus lisible en sautant des lignes de temps en temps et en prenant soin de mettre des espaces autour des opérateurs ==, =, *, etc. N’hésites pas à jeter un œil aux recommandations de la PEP 8 et de la PEP 20. Tu peux même installer l’outil autopep8 pour automatiser ça.

Aussi, au lieu d’écrire :

else:
    if long=="0":
        Errors.MessageErreurZero(); erreur=erreur+1

tu peux écrire :

elif long=="0":
    Errors.MessageErreurZero(); erreur=erreur+1

Situphen

Merci pour ton aide, et en particulier pour les else

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte