#1 Le 06/03/2014, à 10: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, à 12: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, à 13:01)
Hors ligne
#3 Le 06/03/2014, à 13: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!
Mon blog: http://blog.bores.fr
Mon wiki: http://bores.fr/wiki
Mes programmes libres: https://github.com/tbores
Hors ligne
#4 Le 06/03/2014, à 14:59
- Maga
Re : [Python] Analyse d'un code (simple) qui plante...
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, à 17: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.
Mon blog: http://blog.bores.fr
Mon wiki: http://bores.fr/wiki
Mes programmes libres: https://github.com/tbores
Hors ligne