Annonce

Réduire
Aucune annonce.

débuter une IHM en python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • débuter une IHM en python

    Bonsoir,

    Voici un petit challenge permettant de débuter les IHM (interface homme machine) très simplement.

    PROBLÉMATIQUE

    Votre patron vous demande de créer un logiciel permettant à chaque personne de se connecter au réseau de l'entreprise.

    Il entrera son login, mot de passe (caché) et cliquera sur le bouton valider.
    Vous pouvez ajouter des fonctionnalités supplémentaires si vous le souhaitez.

    DESCRIPTIF

    1) Entrer le login
    2) Entrer le mot de passe
    3) Possibilité entre le bouton valider ou cancel
    4) Si bouton valider, le login et mot de passe seront vérifiés dans un fichier type texte
    4) Si bouton cancel, effacement du login et mot de passe entrés
    5) Affichage d'une fenêtre de confirmation d'entrée au réseau
    5) Affichage d'une fenêtre d'erreur d'entrée au réseau

    LANGAGE DE PROGRAMMATION

    Python version 2.7 ou 3.x

    INTERFACE GRAPHIQUE

    Tkinter, PyQt (pour ceux qui maîtrise mieux python), wxPython, ...

    CONSEILS

    Vous allez créer une interface simple, rendez votre code le plus lisible possible, pour cela une organisation rigoureuse avec des classes est souhaitable...

    CONVENTIONS

    Une indentation de 4 espaces est obligatoire, voir la PEP8 si vous ne comprenez pas pourquoi...

    Ne dépassez pas 80 caractères sur 1 ligne de code, idem voir PEP8

    Merci pour nos petits yeux!

    Bon courage...

    GUIDE TKINTER

    Afin de vous familiariser avec Tkinter, je vais vous présenter les outils dont vous avez besoin pour avancer dans ce petit challenge.

    AFFICHAGE D'UNE FENÊTRE PRINCIPALE

    Selon la version python, on va devoir importer le module Tkinter

    En version 2.7

    Code:
    from Tkinter import *
    En version 3.x

    Code:
    from tkinter import *
    La différence étant dans la 1ère lettre de Tkinter, soit une majuscule, soit une minuscule selon la version.

    Pour l'affichage d'une fenêtre vide, on va instancier à l'aide de la classe Tk.

    Mémoriser bien ces termes on les utilisera souvent.

    Une instance est un objet créé à l'aide d'une classe que l'on peut considéré comme un dessin de l'objet ou un patron de l'objet.

    classe -> patron de l'objet
    instance -> objet créé

    Créons notre fenêtre, on va l'appeler window, on va se placer en version python 3.x

    Code:
    from tkinter import *
    
    window = Tk()
    
    window.mainloop()
    mainloop est une méthode de la fenêtre créée (window) permettant à celle-ci de rester à l'écran, une genre de boucle infinie.

    On voit à l'écran ceci :

    Selection_003.jpg

    On voit ci-dessus que le curseur >>> n'existe plus une fois mainloop() exécutée, c'est bien par là que l'on devra terminer notre programme.

    Pour quitter cette fenêtre, vous cliquez simplement sur la croix.

    AFFICHAGE DES ENTRÉES UTILISATEURS

    Pour cela nous allons utiliser la classe Entry qui permet de créer une fenêtre d'édition où vous pourrez y insérer vos données (login + mdp)

    La fenêtre d'édition login sera à gauche, tandis que mdp sera à droite.

    Pour cela on va s'imaginer une grille, où login et mdp se trouve sur la même ligne, mais dans une colonne différente.

    Ce qui donnera :

    Selection_004.jpg

    On voit que pour s'imaginer cette grille on a utilisé la méthode grid, qui permettra d'indiquer à nos fenêtre d'édition exactement où se placer.

    AFFICHAGE DES BOUTONS

    Pour afficher nos boutons, on utilisera la classe Button

    Avec grid, placer vos boutons où vous souhaitez, je ne donne qu'un exemple d'utilisation de cette classe.

    Selection_005.jpg

    Au lieu de pack() ci-dessus, utilisez grid(), c'est exprès que je ne donne pas un exemple avec cette méthode.

    AFFICHAGE DES LABELS

    Les labels sont des étiquettes, ça permet d'inscrire du texte sur la fenêtre créée.

    On utilisera pour cela la classe Label.

    Un exemple ci-dessous :

    Selection_006.jpg

    AFFICHAGE DES MESSAGES BOX

    Voici une partie un peu plus complexe,dans le sens où l'affichage d'une fenêtre de validation ou d'erreur dépendra du click sur le bouton "valider"

    La classe Button utilise un paramètre se nommant command et permettant alors d'indiquer quelle fonction sera appelée lors d'un click.

    Imaginons que je souhaite créer un bouton permettant lors du click, d'afficher "Hello World!", il faudra :

    1) Créer une fonction (afficher par exemple) permettant d'afficher Hello World!
    2) Indiquer à la classe Button que la commande à exécuter lors du click est la fonction "afficher"

    Un exemple, avec 5 click sur le bouton Afficher :

    Selection_007.jpg

    Maintenant qu'on sait comment exécuter l'affichage d'une messagebox, il faut connaître la classe messagebox

    Pour cela, vous devez importer spécifiquement messagebox
    (Attention pour la version 2.7 c'est pas la même chose)
    Pour informer l'utilisateur on utilisera la méthode showinfo.

    Le lien de l'image, le forum limitant le nombre d'images à 5.

    L'autre méthode permettant d'indiquer une erreur avec une messagebox est showerror.

    Voilà le guide terminé, à vous de jouer...
    Dernière modification par fred, 10 mars 2013, 13h42.

  • #2
    Voici une proposition de code.

    Evidemment je n'en demande pas tant, vous pouvez vous y inspirer, mais faîtes cela seul, vous en serez d'autant plus fier.

    Code:
    from tkinter import *
    from tkinter import messagebox
    
    class MainWindow(Tk):
        def __init__(self, my_file):
            Tk.__init__(self)
            self.title("Connection network") # Titre de la fenêtre
            self.create_button()
            self.create_widgets()
            self.list_of_login = load(my_file)
            
        def create_button(self):
            """create widgets Button for validate or cancel data"""
            self.valider = Button(text="valider", command=self.display)
            self.valider.grid(row=1, column=1)
            
            self.cancel = Button(text="abandon", command=self.canceled)
            self.cancel.grid(row=1, column=3)
            
        def create_widgets(self):
            """create widgets Entry for login and password"""
            self.text_login = Label(self, text="Login : ")
            self.text_login.grid(row=0, column=0)
            
            self.login = Entry(self)
            self.login.grid(row=0, column=1)
            
            self.text_pass = Label(self, text="Password : ")
            self.text_pass.grid(row=0, column=2)
            
            self.password = Entry(self, show='*')
            self.password.grid(row=0, column=3)
        
        def is_valid(self):
            """verify login and password"""
            login = self.login.get()
            mdp = self.password.get()
            
            inf = login + " " + mdp
            
            for infos in self.list_of_login:
                if inf == infos:
                    return 1
            
            return 0
    
        def display(self):
            """display the message of validation"""
            if self.is_valid():
                messagebox.showinfo("Login successful")
            else:
                messagebox.showerror("Login error")
                
            self.canceled()
                
    
        def canceled(self):
            """clear the widgets login and password"""
            self.login.delete(0, END)
            self.password.delete(0, END)
    
    def load(file_data):
        """load the file containing login and password"""
        with open(file_data, 'r') as f:
            lines = [line.strip('\n') for line in f.readlines()]
        return lines
    
    main = MainWindow("mdp.txt")
    main.mainloop()
    Selection_010.jpg

    Selection_011.jpg

    Selection_012.jpg

    Selection_013.jpg

    Tout terminé!

    Selection_014.jpg

    N'ayez pas peur, l'apprentissage python est rapide
    Dernière modification par fred, 10 mars 2013, 16h11. Motif: Ajout des labels

    Commentaire


    • #3
      Enfin finalisé

      Selection_015.jpg

      Commentaire


      • #4
        Salut Fred.

        Je suis parti dans ton challenge
        Et j'ai décidé d'utiliser PyQt4 avec son éditeur.
        Peut-être sais-tu l'utiliser ?

        Voici mon début de projet :

        \SIRP.py

        Code:
        # Python 3.3
        from PyQt4 import QtCore, QtGui
        import core
        import sys
        
        GUI=core.GUI
        conUI=core.connexion_ui
        
        def main():
            app = QtGui.QApplication(sys.argv)
            myapp = GUI.MyApp()
            myapp.show()
            winapps=conUI.Ui_Connexion().setupUi(myapp)
            sys.exit(app.exec_())
        
        if __name__ == '__main__':
            main()
        \core\__init__.py

        Code:
        import core.connexion_ui
        import core.GUI
        \core\connexion_ui.py

        Code:
        # -*- coding: utf-8 -*-
        
        # GENERATE BY PyQt4
        #
        # Created: Sun Mar 10 17:40:15 2013
        #      by: PyQt4 UI code generator 4.10
        #
        # WARNING! All changes made in this file will be lost!
        
        from PyQt4 import QtCore, QtGui
        
        try:
            _fromUtf8 = QtCore.QString.fromUtf8
        except AttributeError:
            def _fromUtf8(s):
                return s
        
        try:
            _encoding = QtGui.QApplication.UnicodeUTF8
            def _translate(context, text, disambig):
                return QtGui.QApplication.translate(context, text, disambig, _encoding)
        except AttributeError:
            def _translate(context, text, disambig):
                return QtGui.QApplication.translate(context, text, disambig)
        
        class Ui_Connexion(object):
            def setupUi(self, Connexion):
                Connexion.setObjectName(_fromUtf8("Connexion"))
                Connexion.resize(800, 600)
                self.centralwidget = QtGui.QWidget(Connexion)
                self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
                self.Button = QtGui.QPushButton(self.centralwidget)
                self.Button.setGeometry(QtCore.QRect(300, 420, 141, 51))
                self.Button.setObjectName(_fromUtf8("Button"))
                self.lineEdit = QtGui.QLineEdit(self.centralwidget)
                self.lineEdit.setGeometry(QtCore.QRect(232, 239, 291, 31))
                font = QtGui.QFont()
                font.setPointSize(12)
                self.lineEdit.setFont(font)
                self.lineEdit.setAlignment(QtCore.Qt.AlignCenter)
                self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
                self.lineEdit_2 = QtGui.QLineEdit(self.centralwidget)
                self.lineEdit_2.setGeometry(QtCore.QRect(230, 290, 291, 31))
                font = QtGui.QFont()
                font.setPointSize(12)
                self.lineEdit_2.setFont(font)
                self.lineEdit_2.setInputMethodHints(QtCore.Qt.ImhNone)
                self.lineEdit_2.setAlignment(QtCore.Qt.AlignCenter)
                self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
                Connexion.setCentralWidget(self.centralwidget)
                self.menubar = QtGui.QMenuBar(Connexion)
                self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
                self.menubar.setObjectName(_fromUtf8("menubar"))
                self.menuConnexion = QtGui.QMenu(self.menubar)
                self.menuConnexion.setObjectName(_fromUtf8("menuConnexion"))
                Connexion.setMenuBar(self.menubar)
                self.statusbar = QtGui.QStatusBar(Connexion)
                self.statusbar.setObjectName(_fromUtf8("statusbar"))
                Connexion.setStatusBar(self.statusbar)
                self.actionConfiguration = QtGui.QAction(Connexion)
                self.actionConfiguration.setObjectName(_fromUtf8("actionConfiguration"))
                self.actionQuitter = QtGui.QAction(Connexion)
                self.actionQuitter.setObjectName(_fromUtf8("actionQuitter"))
                self.menuConnexion.addAction(self.actionConfiguration)
                self.menuConnexion.addAction(self.actionQuitter)
                self.menubar.addAction(self.menuConnexion.menuAction())
        
                self.retranslateUi(Connexion)
                QtCore.QMetaObject.connectSlotsByName(Connexion)
        
            def retranslateUi(self, Connexion):
                Connexion.setWindowTitle(_translate("Connexion", "MainWindow", None))
                self.Button.setText(_translate("Connexion", "Connexion", None))
                self.lineEdit_2.setInputMask(_translate("Connexion", " ; ", None))
                self.menuConnexion.setTitle(_translate("Connexion", "Option", None))
                self.actionConfiguration.setText(_translate("Connexion", "Configuration", None))
                self.actionQuitter.setText(_translate("Connexion", "Quitter", None))
        \core\GUI.py

        Code:
        from PyQt4 import QtCore, QtGui
        import sys
        
        class Drawer(QtGui.QWidget):
            def __init__(self, parent=None):
                super(Drawer, self).__init__(parent)
                self.setStyleSheet("QWidget { background-color: %s }" % QtGui.QColor(99, 0, 0).name())
            def mousePressEvent(self, event):
                print('mouse pressed')
                self.update();
        
        class MyApp(QtGui.QMainWindow):
            def __init__(self, parent=None):
                QtGui.QWidget.__init__(self, parent)
                self.drawer = Drawer(self)
        GUI.jpg

        Le code fonctionne. Malheureusement je ne sais pas comment créer des événements sur l'éditeur PyQt4 pour animer le programme : vérification du pseudo / password et changer de fenêtre.

        Aurais-tu une idée ? Un tutoriel en ligne ? C'est l'occasion de demander
        Merci d'avance et merci pour ton challenge.
        Dernière modification par Yarflam, 10 mars 2013, 18h31.
        ~ Yarflam ~

        ❉ L'Univers se dirige vers son ultime perfection ❉

        Commentaire


        • #5
          Plusieurs choses,

          1) Je n'utilise pas le générateur de code pour mes GUI (jamais), donc des choses me semblent inutiles pour un code aussi simple, mais l'essentiel est le fonctionnement

          2) Pour l'affichage des messagebox, il existe une classe QMessageBox, permettant à l'aide des méthodes statiques informations et warning de faire ce que tu veux.
          Voir la doc PyQt

          3) Je trouve ton code très long, je n'ai pas encore fais sous PyQt, mais je pense pas que ça prendra autant de lignes de code, en tout cas je ne l'imaginais pas...

          4) Je vois que tu ne fais pas agir le click de la souris lors de l'appui sur un bouton, je te conseille de découvrir PyQt en faisant ta GUI à la main, il y a des tutoriels très simples sur le sujet

          Commentaire


          • #6
            Je ne pensais pas que tu réfuterai l'idée d'utiliser un éditeur.
            Enfin soit, je vais essayer de programmer le logiciel à la main.
            ~ Yarflam ~

            ❉ L'Univers se dirige vers son ultime perfection ❉

            Commentaire


            • #7
              Je ne le réfute pas, je l'utilise de temps en temps pour faire des GUI rapidement, mais j'ai commencé PyQt en me tapant mes GUI à la main, et comme c'est un challenge pour débutant, découvrir PyQt avec un éditeur est "ambitieux".

              Maintenant, si tu veux le faire, pas de problème pour moi je connais bien, seulement si je le conseille, ce n'est pas pour embêter

              Commentaire


              • #8
                Voilà les 1er ossements de mon IHM avec PyQt, il manque les fonctions permettant d'interagir avec les boutons, pas trop le temps de faire plus.

                Sur le principe, voilà ce que j'ai fais, il y d'autres stratégies.

                1) Créer 2 QHBoxLayout, permettant de créer deux lignes de widgets (QLineEdit et QPushButton)
                2) Les regrouper à l'aide d'un QGridLayout
                3) Insérer mon QGridLayout dans mon QMainWindow (fenêtre principale)

                Voilà l'image de l'IHM

                Selection_017.png

                Voici mon code

                Code:
                from PyQt4.QtGui import QApplication, QMainWindow, QHBoxLayout, QGridLayout
                from PyQt4.QtGui import QWidget, QLabel, QLineEdit, QPushButton
                import sys
                
                class Window(QMainWindow):
                    def __init__(self):
                        QMainWindow.__init__(self)
                        self.add_widget()
                        self.widget = QWidget()
                        self.grid = QGridLayout()
                        self.grid.addWidget(self.wid_ent, 0, 0)
                        self.grid.addWidget(self.wid_button, 1, 0)
                        self.widget.setLayout(self.grid)
                        self.setCentralWidget(self.widget)
                        self.show()
                        
                    def add_box(self):
                        self.wid_ent = QWidget()
                    
                        self.login = QLabel("Login : ")
                        self.ent_login = QLineEdit()
                        self.password = QLabel("Password : ")
                        self.ent_password = QLineEdit()
                        self.box = QHBoxLayout()
                    
                        self.box.addWidget(self.login)
                        self.box.addWidget(self.ent_login)
                        self.box.addWidget(self.password)
                        self.box.addWidget(self.ent_password)
                        
                        self.wid_ent.setLayout(self.box)
                        
                    def add_widget(self):
                        self.add_box()
                        self.add_buttons()
                    
                    def add_buttons(self):
                        self.wid_button = QWidget()    
                        
                        self.button_valider = QPushButton("Valid")
                        self.button_cancel = QPushButton("Cancel")
                        
                        self.box_buttons = QHBoxLayout()
                        
                        self.box_buttons.addWidget(self.button_valider)
                        self.box_buttons.addWidget(self.button_cancel)
                        
                        self.wid_button.setLayout(self.box_buttons)
                
                app = QApplication(sys.argv)
                window = Window()
                exec_ = app.exec_()
                Dernière modification par fred, 10 mars 2013, 21h26.

                Commentaire


                • #9
                  Voici le code terminé et fonctionnel, c'est nettement plus beau que tkinter, mais plus complexe, tellement les possibilités sont importantes.

                  Selection_018.jpg

                  Selection_019.jpg

                  Code:
                  from PyQt4.QtGui import QApplication, QMainWindow, QHBoxLayout, QGridLayout
                  from PyQt4.QtGui import QWidget, QLabel, QLineEdit, QPushButton, QMessageBox
                  from PyQt4.QtCore import SIGNAL
                  import sys
                  
                  class Window(QMainWindow):
                      def __init__(self, my_file):
                          QMainWindow.__init__(self)
                          self.list_of_login = load(my_file)
                          self.display()
                  
                      def display(self):
                          self.add_widget()
                          self.widget = QWidget()
                          self.grid = QGridLayout()
                          self.grid.addWidget(self.wid_ent, 0, 0)
                          self.grid.addWidget(self.wid_button, 1, 0)
                          self.widget.setLayout(self.grid)
                          self.setCentralWidget(self.widget)
                          self.show()
                  
                      def add_box(self):
                          self.wid_ent = QWidget()
                      
                          self.login = QLabel("Login : ")
                          self.ent_login = QLineEdit()
                          self.password = QLabel("Password : ")
                          self.ent_password = QLineEdit()
                          self.ent_password.setEchoMode(QLineEdit.Password)
                          self.box = QHBoxLayout()
                      
                          self.box.addWidget(self.login)
                          self.box.addWidget(self.ent_login)
                          self.box.addWidget(self.password)
                          self.box.addWidget(self.ent_password)
                          
                          self.wid_ent.setLayout(self.box)
                          
                      def add_widget(self):
                          self.add_box()
                          self.add_buttons()
                      
                      def add_buttons(self):
                          self.wid_button = QWidget()    
                          
                          self.button_valider = QPushButton("Valid")
                          self.button_cancel = QPushButton("Cancel")
                          
                          self.button_valider.connect(self.button_valider, SIGNAL("clicked()"), self.display_messages)
                          self.button_cancel.connect(self.button_cancel, SIGNAL("clicked()"), self.canceled)
                          
                          self.box_buttons = QHBoxLayout()
                          
                          self.box_buttons.addWidget(self.button_valider)
                          self.box_buttons.addWidget(self.button_cancel)
                          
                          self.wid_button.setLayout(self.box_buttons)
                      
                      def is_valid(self):
                          login = self.ent_login.text()
                          mdp = self.ent_password.text()
                          
                          inf = login + " " + mdp
                          
                          for infos in self.list_of_login:
                              if inf == infos:
                                  return 1
                          
                          return 0
                          
                      def display_messages(self):
                          message = QMessageBox()
                          if self.is_valid():
                              message.information(self, "connection", "connection successful")       
                          else:
                              message.warning(self, "connection", "connection failed")
                              
                          message.show()    
                      
                      def canceled(self):
                          self.ent_login.clear()
                          self.ent_password.clear()
                  
                  def load(file_data):
                      with open(file_data, 'r') as f:
                          lines = [line.strip('\n') for line in f.readlines()]
                      return lines
                  
                  app = QApplication(sys.argv)
                  window = Window("mdp.txt")
                  exec_ = app.exec_()
                  Dernière modification par fred, 10 mars 2013, 22h47.

                  Commentaire


                  • #10
                    Salut Fred !
                    J'ai bien avancé le challenge :
                    Téléchargement

                    \SIRP.py

                    Code:
                    # -*- coding: iso-8859-1 -*-
                    """ +===========================+
                        |   Système d'Information   |
                        | pour Réseau Professionnel |
                        |         (SIRP)            |
                        |                           |
                        |      Version client       |
                        |                           |
                        | Par Yarflam               |
                        +===========================+ """
                    import core
                    
                    if __name__=='__main__':
                        fen=core.con.main("http://yarflam.olympe.in/Experiment/tstco.php")
                    \core\__init__.py
                    Code:
                    # -*- coding: iso-8859-1 -*-
                    import core.connexion as con
                    \core\connexion.py
                    Code:
                    # -*- coding: iso-8859-1 -*-
                    from PyQt4 import QtGui, QtCore
                    import urllib.parse
                    import urllib.request
                    import sys
                    
                    class main():
                        def __init__(self,url):
                            self.e=[]
                            self.url=url
                            self.app = QtGui.QApplication(sys.argv)
                            self.new_widget('SIRP',500,250,400,150,'images/web.png')
                            self.menu = QtGui.QMenuBar(self.widget)
                            #=====================================#
                            self.new_button('Connexion',225,200,'self.connect') #0
                            self.new_menubar('Option') #1
                            self.new_event('Configuration','self.config') #2
                            self.new_event('Quitter','self.widget.close') #3
                            self.new_text('<b><i>Identifiant</i></b>',100,105) #4
                            self.new_input('text',200,100) #5
                            self.new_text('<b><i>Mot de passe</i></b>',100,145) #6
                            self.new_input('password',200,140) #7
                            self.new_text("<font color='blue'><h2>SIRP client</h2></font>",218,50) #8
                            #=====================================#
                            self.new_itembar(1,2)
                            self.new_itembar(1,3)
                            self.widget.show()
                            self.app.exec_()
                        def http(self):
                            # REQUETE
                            params = urllib.parse.urlencode({"identifiant":self.pseudo, "pass":self.password})
                            params = params.encode('utf-8')
                            r=urllib.request.urlopen(self.url, params).read()
                            return 1 if (str(r) == "b'1'") else 0
                        def config(self):
                            # CONFIGURATION
                            rep, ok = QtGui.QInputDialog.getText(self.widget, "Configuration", "["+self.url+"]\n\nSaisissez l'adresse de connexion.")
                            if ok:
                                if (len(rep) > 0): self.url=rep
                                print("set "+self.url+"")
                        def connect(self):
                            # CONNEXION
                            self.pseudo=str(self.e[5].text())
                            self.password=str(self.e[7].text())
                            if (len(self.pseudo) > 0) and (len(self.password) > 0):
                                if self.http():
                                    self.new_alert("Connexion","Vous êtes connecté !")
                                else:
                                    self.new_alert("Connexion","Erreur de connexion !")
                            else:
                                self.new_alert("Connexion","Veuillez remplir le formulaire.")
                        def new_e(self):
                            # ELEMENTS
                            self.e.append(1)
                            return (len(self.e)-1)
                        def new_widget(self,name,x,y,mx,my,img):
                            # WINDOW
                            self.widget = QtGui.QWidget()
                            self.widget.resize(x, y)
                            self.widget.move(mx, my)
                            self.widget.setWindowTitle(name)
                            self.widget.setWindowIcon(QtGui.QIcon(img))
                        def new_button(self,value,x,y,cmd):
                            # BUTTON
                            sce=self.new_e()
                            self.e[sce] = QtGui.QPushButton(value, self.widget)
                            self.e[sce].resize(self.e[sce].sizeHint())
                            self.e[sce].move(x, y)
                            exec("self.widget.connect(self.e[sce], QtCore.SIGNAL('clicked()'), "+cmd+")")
                            self.e[sce].show()
                        def new_event(self,value,cmd):
                            # EVENT
                            sce=self.new_e()
                            self.e[sce] = QtGui.QAction(value, self.widget)
                            exec("self.e[sce].triggered.connect("+cmd+")")
                        def new_menubar(self,value):
                            # MENUBAR
                            sce=self.new_e()
                            self.e[sce] = self.menu.addMenu('&'+value)
                        def new_itembar(self,menubar,event):
                            # ITEM FOR MENUBAR
                            self.e[menubar].addAction(self.e[event])
                        def new_input(self,mod,x,y):
                            # INPUT
                            sce=self.new_e()
                            self.e[sce] = QtGui.QLineEdit(self.widget)
                            if mod == 'password': self.e[sce].setEchoMode(QtGui.QLineEdit.Password)
                            self.e[sce].move(x, y)
                            self.e[sce].show()
                        def new_text(self,value,x,y):
                            # TEXT
                            sce=self.new_e()
                            self.e[sce] = QtGui.QLabel(self.widget)
                            self.e[sce].setText(value)
                            self.e[sce].move(x, y)
                            self.e[sce].show()
                        def new_alert(self,title,data):
                            # ALERT
                            sce=self.new_e()
                            self.e[sce]=QtGui.QMessageBox.information(self.widget, title, data)
                    \images\web.png
                    web.jpg

                    SIRP.jpg

                    Je compte l'améliorer.

                    Voici les sites internet qui m'ont aidés :
                    http://zetcode.com/
                    http://fr.wikibooks.org/wiki/PyQt/QLabel
                    http://srinikom.github.com/pyside-do...essageBox.html

                    Si tu veux tester:
                    -> Identifiant : Yarflam
                    -> Mot de passe : pass
                    Dernière modification par Yarflam, 11 mars 2013, 14h38.
                    ~ Yarflam ~

                    ❉ L'Univers se dirige vers son ultime perfection ❉

                    Commentaire


                    • #11
                      Yes, very good

                      BRAVO!

                      Les points positifs

                      1) Tu as mis de la couleur (texte + fond)
                      2) Ajout d'une icône
                      3) Indentation respectée

                      Mais comme tout n'est jamais parfait, quelques remarques

                      1) Des lignes font plus de 80 caractères
                      2) Le login et pass devaient se trouver sur un fichier type texte
                      3) Des fois il est difficile d'être dans le code de quelqu'un, il est dans son trip, fait des inliners au dépend de la lisibilité (personnellement je trouve ça dommage), ce qui rend ton code difficilement maintenable, même par toi-même. Imaginons que tu reprennes ce code 3 ans plus tard, vas-tu passer plus de temps à recomprendre ton code et le modifier ou à le refaire?
                      4) from PyQt4 import QtGui, QtCore ne permet pas de savoir quels sont les éléments t'étant utiles, et c'est dommage car ça renseigne bien sur ta stratégie pour coder.

                      Encore bravo!

                      Commentaire


                      • #12
                        Merci

                        2) Le login et pass devaient se trouver sur un fichier type texte
                        Oui, je sais. J'ai eu envie d'innover.


                        3) Des fois il est difficile d'être dans le code de quelqu'un, il est dans son trip, fait des inliners au dépend de la lisibilité (personnellement je trouve ça dommage), ce qui rend ton code difficilement maintenable, même par toi-même. Imaginons que tu reprennes ce code 3 ans plus tard, vas-tu passer plus de temps à recomprendre ton code et le modifier ou à le refaire?
                        Je vais rectifier mon code source pour qu'il soit plus lisible.

                        Édit: A propos, ton code affiche une petite message box qui disparaît tout de suite une fois la vérification du mot de passe. Ce problème est rectifié dans mon code source, il suffit de mettre qu'une seule ligne.
                        Code:
                        msg=QMessageBox.information(self.widget, title, contenu)
                        Dernière modification par Yarflam, 11 mars 2013, 20h09.
                        ~ Yarflam ~

                        ❉ L'Univers se dirige vers son ultime perfection ❉

                        Commentaire


                        • #13
                          Édit: A propos, ton code affiche une petite message box qui disparaît tout de suite une fois la vérification du mot de passe. Ce problème est rectifié dans mon code source, il suffit de mettre qu'une seule ligne.
                          Je vois pas de quoi tu parles, mon QMessageBox reste bien en place tant que je ne clique pas sur OK ou j'ai pas pigé ce que tu voulais dire...

                          Commentaire


                          • #14
                            Tu n'as pas compris. Une fois que tu cliques sur OK, une petite fenêtre apparaît et disparaît presque instantanément. Ce n'est pas très visible, mais ça choc une fois qu'on la repéré.

                            FenExt.jpg
                            ~ Yarflam ~

                            ❉ L'Univers se dirige vers son ultime perfection ❉

                            Commentaire


                            • #15
                              Tu testes sur windows ou sur linux? Je suis sur Linux et je n'ai pas du tout de fenêtre apparaissant...

                              Commentaire

                              Chargement...
                              X