Question découpage de scripts en morceaux

Signaler
Messages postés
5
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
2 janvier 2020
-
amiga56
Messages postés
5
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
2 janvier 2020
-
Bonjour,

J’ai un script qui commence à grandir pas mal(ce n'est pas terminé) et je me pose la question de le découper (il y avait 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 (partie "def cs_bt_calc_clicked"), après quelques essais j'arrive miraculeusement à un ensemble fonctionnel mais je ne m'explique pas que ça marche !

Voici les 2 parties :

# 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 loa seconde partie qui se nomme "VerifCoussinet.py"

import gi
import Errors
from math import *

def Calcul(self):
    erreur = 0
    # collecte du contenu des champs de l'interface graphique
    N = self.cs_effort.get_text()
    dia = self.cs_dia.get_text()
    long = self.cs_long.get_text()
    freq = self.cs_freq.get_text()
    # vérifier que les champs sont numérique et pour certains, non nul
    if not Errors.is_numeric(N):
        Errors.MessageErreur(); erreur += 1
    if not Errors.is_numeric(dia):
        Errors.MessageErreur(); erreur += 1
    elif dia == "0":
        Errors.MessageErreurZero(); erreur += 1
    if not Errors.is_numeric(long):
        Errors.MessageErreur(); erreur += 1
    elif long == "0":
        Errors.MessageErreurZero(); erreur += 1
    if not Errors.is_numeric(freq):
        Errors.MessageErreur(); erreur += 1
    # si aucune erreur on peut éffectuer les calculs
    if erreur <= 0:
        pression = float(N) / (float(dia) * float(long))
        vitesse = float(dia) * pi * float(freq) / 60000
        pv = pression * vitesse
        # mise a jour des labels de l'interface graphique afin d'avoir l'affichage des résultats
        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)


pouvez vous m'expliquer la chose? , voire me faire des critiques !

2 réponses

Bonjour,

Qu'est-ce qui t'étonnes ?
self contient l'instance de EssaiDeNotebook que tu passes en paramètre de VerifCoussinet.Calcul, donc la fonction Calcul peut travailler dessus comme s'il était à l'intérieur de ta classe, et par conséquent devient une méthode de ta classe.
Si cela te surprend, c'est que tu n'as pas bien compris à quoi sert le 1er argument des méthodes (self) dans les méthodes de classes en python.

Comme on ne sait pas ce que ton script est censé faire, en plus il faut bien connaître le module gtk, difficile d'émettre des critiques. On ne sait pas pourquoi tu veux placer une méthode de ta classe dans un autre module, une classe de même pas 100 lignes, c'est pas grand-chose niveau nombre de lignes d'une classe et encore moins d'un fichier py
amiga56
Messages postés
5
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
2 janvier 2020

merci pour ta réponse, je ne suis pas expert de la poo mais je comprend mieux maintenant

mon fichier graphique (.glade) est organisé en volets différents et mon programme n'en est qu'au début, il va grandir pas mal au fil des modules que je vais implanter.
Tu peux améliorer également ta méthode Calcul en testant les erreurs dans des boucles puisque tu testes la même chose. Et utiliser format pour afficher tes valeurs. Ce qui pourrait donner

def Calcul(self):
    erreur = False
    for text in (N, dia, long, freq):
        if not Errors.is_numeric(text):
            Errors.MessageErreur()
            erreur = True
            break
    else:
        for text in (dia, long):
            if text == "0":
                Errors.MessageErreurZero()
                erreur = True
                break
    if not erreur:
        pression = float(N) / (float(dia) * float(long))
        vitesse = float(dia) * pi * float(freq) / 60000
        pv = pression * vitesse
        # mise a jour des labels de l'interface graphique afin d'avoir l'affichage des résultats
        self.cs_vitesse.set_label(str(vitesse))
        self.cs_pression.set_label(str(pression))
        self.cs_pv.set_label(str(pv))
        repr = "Effort={}, Diamètre={}, Long={},  Freq={}".format(N, dia, long, freq)
        print(repr)


Cela rend personnellement les choses plus claires que plusieurs conditions.
amiga56
Messages postés
5
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
2 janvier 2020

Merci, effectivement c'est plus esthétique et plus clair