Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/03/2014, à 11:54

Maga

[Python] Analyse d'un code (simple) qui plante...

Bonjour,

Je suis en train de tester un code assez basique avec pygtk en vue de créer une interface pour un logiciel un poil plus élaboré.
Ce code affiche une fenêtre avec un label donnant l'heure (via le callback). Ensuite une fonction scanXml parse un fichier xml et affiche des boutons avec les paramètres trouvés dans le xml.

J'ai eu quelques soucis avec l'indentation que je pense résolus mais au lancement, la console me dit maintenant :

File "scriptodome_N.py", line 14, in <module>
    class Scriptodome:
  File "scriptodome_N.py", line 87, in Scriptodome
    scanXml(self)
NameError: name 'self' is not defined

Voici le code, quelques commentaires peuvent-ils m'ouvrir les yeux ? J'avoue que les tutos et explications que je trouve sur le web ne sont pas très explicites pour moi sur la structure de l'ensemble du code !

Merci.

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# example bloc_notes.py

import pygtk
pygtk.require('2.0')
import gtk, gobject
import random
import pango
import shutil
import os.path
import time

class Scriptodome:

    def delete(self, widget, event=None):
        gtk.main_quit()
        return False

    #Timer *************************************************************************************************

    def __init__(self, timeout):

        #i=425


        self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.fenetre.connect("delete_event", self.delete)
        self.fenetre.set_border_width(10)
        self.fenetre.set_default_size(1280,768)
        self.fenetre.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(255,0,0))

        vbox = gtk.VBox() # Widget de centrage de la fenetre
        self.fenetre.add(vbox)
        self.conteneurInterface = gtk.Fixed() # Conteneur permettant de positionner précisément les autres widgets
        #gtk_widget_set_size_request(self.conteneurInterface, 1280, 768)
        self.labelTimer = gtk.Label('Periodic Timer') # Label du timer
        self.labelTimer.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FF0000'))
        self.labelTimer.modify_font(pango.FontDescription("sans 14"))
        vbox.pack_start(self.conteneurInterface)
        self.conteneurInterface.put(self.labelTimer,300,400)
        self.fenetre.show_all()

    # register a periodic timer
        self.counter = 0
        gobject.timeout_add_seconds(timeout, self.callback)


    def callback(self):
        now = time.localtime(time.time())
        year, month, day, hour, minute, second, weekday, yearday, daylight = now
        #time.asctime(now)
        self.labelTimer.set_text(time.strftime("%H:%M:%S", now))
        self.counter += 1
        return True




    def scanXml (self):
    
            from lxml import etree # LXML
            tree = etree.parse("biblioscripts.xml")
            for script in tree.xpath("/biblioscripts/script"):
    
                self.bouton = gtk.Button()
                self.conteneurInterface.put(self.bouton,300,i)
                self.etiq = gtk.Label(script.get("nom"))
                self.etiq.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FF0000'))
                self.etiq.modify_font(pango.FontDescription("11"))
                self.bouton.add(self.etiq)
                self.etiq.show()
                self.bouton.show()
                
                self.bouton2 = gtk.Button()
                self.conteneurInterface.put(self.bouton2,300,i+30)
                scriptEnfant = script.getchildren() # listcontent permet de monter un niveau dans la hiérarchie ".getchildren"
                self.etiq2 = gtk.Label(scriptEnfant[2].text) # Le numéro permet de choisir quel noeud à ce niveau est sélectionné
                self.etiq2.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#FF0000'))
                self.etiq2.modify_font(pango.FontDescription("12"))
                self.bouton2.add(self.etiq2)
                self.etiq2.show()
                self.bouton2.show()
                i=i+60

    #fenetre.show()
    scanXml(self)

def main():
    gtk.main()
    return 0

if __name__ == "__main__":
    periodic_timer = Scriptodome(1)
    #Scriptodome()
    main()

Hors ligne

#2 Le 06/03/2014, à 13:59

Maga

Re : [Python] Analyse d'un code (simple) qui plante...

Pour compléter :
Je souhaiterais tout simplement lancer la fonction sanXml, déjà sans argument autre que 'self' si c'est indispensable...
C'est à dire l'appeller sans passer par un bouton ou autre, donc directement dans le corps du programme. Mais ça me renvoi dans les choux !

Dernière modification par Maga (Le 06/03/2014, à 14:01)

Hors ligne

#3 Le 06/03/2014, à 14:10

psyphi

Re : [Python] Analyse d'un code (simple) qui plante...

Ton appel de scanXml(self) est faux, il est en plein milieu de la classe!

Hors ligne

#4 Le 06/03/2014, à 15:59

Maga

Re : [Python] Analyse d'un code (simple) qui plante...

psyphi a écrit :

Ton appel de scanXml(self) est faux, il est en plein milieu de la classe!

Merci pour ta réponse, je cherche justement à comprendre où le placer.
En cherchant sur le web, je n'arrive pas à piger où écrire les appels bruts des fonctions.

Hors ligne

#5 Le 06/03/2014, à 18:07

psyphi

Re : [Python] Analyse d'un code (simple) qui plante...

Je pense que tu devrais lire un ou deux cours sur la programmation orienté objet (POO). Ou, si tu n'as pas de besoin absolu de classe, utiliser python en paradigme de programmation procédurale.
Néanmoins pour répondre à ta question: scanXml n'est pas une fonction mais une méthode de la classe Scriptodome. Tu ne peux donc l'utiliser que via un objet qui instancie la classe Scriptodome. Dans ton cas il s'agit de l'objet periodic_timer. Il faut donc que tu écrives

periodic_timer.scanXml()

Et cela après la fonction main. Car si j'ai bien compris ta fonction main initialise Gtk qui est utilisé par la classe Scriptodome. Mais je n'ai jamais utlisé Gtk et Python ensemble.

Hors ligne