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 29/05/2008, à 16:52

elfoiros

[pygtk] Mise a jour d'un gtk.Entry

Hello tous,

Je met à jour un champ text ( phonenumber = gtk.Entry() ) , ensuite j'attend 5 secondes (Voir code)

Le problème : Le champ est mis a jour après le time.sleep(5) et non avant ???


       self.phonenumber.set_text("Envoi en cours ... Wait")
       self.phonenumber.connect("activate", self.enter_callback, self.phonenumber)
       self.phonenumber.select_region(0, len(self.phonenumber.get_text()))

       time.sleep(5)

Toutes réponses peut aider smile

Le code complet si vous voulez tester :

#!/usr/bin/env python
# -*- coding:Utf-8 -*-


import pygtk
pygtk.require('2.0')
import gtk
import popen2
import os
import sys
import time
import re
#from pysqlite2 import dbapi2 as sqlite
#from datetime import date

class EntryExample:
   nbchar = 0
   textview = gtk.TextView()
   textview2 = gtk.TextView()
   phonenumber = gtk.Entry()

   DEF_PAD = 10
   DEF_PAD_SMALL = 5

   def _exec(self,cmd, input=None, wout=False):
       """ Exécute une commande système

       Le module popen2 est utilisé pour l'exécution de la commande. Un
       objet Popen4 est créé car il regroupe la sortie standard et la sortie
       d'erreur dans le même fd.
       De plus, popen2 est le seul à  pouvoir capturer retourner le code de
       sortie de la commande.

       cmd -- commande à  exécuter
       input -- données à  injecter sur l'entrée standard de la commande
       wout -- flag indiquant de retourner la sortie de la commande
       """
       child = popen2.Popen4(cmd)
       if input:
               child.tochild.write(input)
               child.tochild.close()
       ret = child.wait()
       output = None
       if wout:
               output = child.fromchild.read()

       if not ret:
               code = 0
       else:
               if os.WIFEXITED(ret):
                       code = os.WEXITSTATUS(ret), output
               else:
                       code = -1
       return code, output


   def exec_local(self,cmd, input=None, wout=False, log=False, sudo=False):
       """Exécute une commande locale

       Au besoin, il est possible d'enregistrer la sortie de la commande
       dans un journal.

       cmd -- la commande à  exécuter
       input -- données à  injecter sur l'entrée standard de la commande
       wout -- flag indiquant de retourner la sortie de la commande
       log -- flag indiquant l'enregistrement de la sortie
       sudo -- indique d'utiliser la commande sudo pour les droits root
       """
       if sudo:
               cmd = "sudo %s" % cmd
       code, output = self._exec(cmd, input, wout or log)
       if log:
               import logging

               logger = logging.getLogger("default_logger")
               for line in output:
                       line = line.rstrip()
                       logger.info(line)
       if wout:
               return code, output
       return code


   def enter_callback(self, widget, entry):
       entry_text = entry.get_text()
       print "Entry contents: %s\n" % entry_text

   def entry_toggle_historiser(self, checkbutton, entry):
       entry.set_editable(checkbutton.get_active())
       code, historiser = self.exec_local("ls /tmp",None,True)


   def entry_toggle_visibility(self, checkbutton, entry):
       entry.set_visibility(checkbutton.get_active())

   def on_change_text(self,a):
       textbuffer = self.textview.get_buffer()
       textbuffer2 = self.textview2.get_buffer()
       start, end = textbuffer.get_bounds()
       nbchar = textbuffer.get_char_count()
       print "Nombre de caractères : ", nbchar
       text = textbuffer.get_text(start, end)
       print "Message : " , text
       thenumber = self.phonenumber.get_text()
       print "Numero : " , thenumber
       cmd = "send_sms.py %s \"%s\"" % (self.phonenumber.get_text(),text)
       #cmd = "echo \"Envoi factice (en cours de dev) d'un SMS\""
       #cmd = "sleep 5 ; echo \"Done done done\""
       print "Commande : ", cmd

       self.phonenumber.set_text("Envoi en cours ... Wait")
       self.phonenumber.connect("activate", self.enter_callback, self.phonenumber)
       self.phonenumber.select_region(0, len(self.phonenumber.get_text()))

       code, sending = self.exec_local("",None,True)
       time.sleep(5)


       #self.phonenumber.set_text("Composer un autre numéro")
       #self.phonenumber.connect("activate", self.enter_callback, self.phonenumber)
       #self.phonenumber.select_region(0, len(self.phonenumber.get_text()))
       if code == 0:
           sending = "Envoi : " + "Réussi" + "\n" + "Numéro : " + thenumber + "\n" + "Nombre de caractères : " + str(nbchar) + "\n" + sending 
       else:
           sending = "Envoi : " + "Echec" + "\n" + "Numéro : " + thenumber + "\n" + "Nombre de caractères : " + str(nbchar) + "\n" + sending 
       print sending
       text = textbuffer2.set_text(sending)

   def __init__(self):
       # create a new window
       window = gtk.Window(gtk.WINDOW_TOPLEVEL)
       window.set_size_request(260, 400)
       window.set_title("GTK Entry")
       window.connect("delete_event", lambda w,e: gtk.main_quit())

       vbox = gtk.VBox(False, 0)
       window.add(vbox)
       vbox.show()

       # Partie inferieur de la fenetre pour la saisi du numéro
       framenumber = gtk.Frame("Numéro de téléphone ...")
       vbox.pack_start(framenumber, True, True, self.DEF_PAD)
       vbox2 = gtk.HBox(True, self.DEF_PAD_SMALL)
       vbox2.set_border_width(10)
       framenumber.add(vbox2)

       self.phonenumber.set_max_length(24)
       self.phonenumber.connect("activate", self.enter_callback, self.phonenumber)
       self.phonenumber.set_text("Saisir le numéro")
       #self.phonenumber.insert_text(" world", len(self.phonenumber.get_text()))
       self.phonenumber.select_region(0, len(self.phonenumber.get_text()))
       vbox2.pack_start(self.phonenumber, True, True, 0)
       self.phonenumber.show()
       numbutton = gtk.Button()
       image = gtk.Image()
       image.set_from_file("/usr/share/pixmap/number.png")
       #image.show()
       numbutton.add(image)
       #numbutton.show()
       numbutton.connect("clicked", lambda w: gtk.main_quit())
       #vbox2.add(numbutton)

       # Partie inferieur de la fenetre pour la saisi du message SMS
       framerestore = gtk.Frame("Taper votre message ...")
       vbox.pack_start(framerestore, True, True, self.DEF_PAD)
       vbox2 = gtk.HBox(True, self.DEF_PAD_SMALL)
       framerestore.add(vbox2)

       sw = gtk.ScrolledWindow()
       sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
       self.textview.set_wrap_mode(True)
       textbuffer = self.textview.get_buffer()
       sw.add(self.textview)
       sw.show()
       self.textview.show()
       vbox2.pack_start(sw)


       # Partie inferieur de la fenetre pour accuse reception
       framerecep = gtk.Frame("Accusé de reception ...")
       vbox.pack_start(framerecep, True, True, self.DEF_PAD)
       vbox2 = gtk.HBox(True, self.DEF_PAD_SMALL)
       framerecep.add(vbox2)

       sw2 = gtk.ScrolledWindow()
       sw2.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
       self.textview2.set_wrap_mode(True)
       textbuffer2 = self.textview2.get_buffer()
       sw2.add(self.textview2)
       sw2.show()
       self.textview2.show()
       vbox2.pack_start(sw2)

       # Partie inferieur de la fenetre Options
       frameoptions = gtk.Frame("Options ...")
       vbox.pack_start(frameoptions, True, True, self.DEF_PAD)
       vbox2 = gtk.HBox(True, self.DEF_PAD_SMALL)
       frameoptions.add(vbox2)
       check = gtk.CheckButton("Historiser")
       vbox2.pack_start(check, True, True, 0)
       check.connect("toggled", self.entry_toggle_historiser, self.phonenumber)
       check.set_active(True)
       check.show()
       check = gtk.CheckButton("Visible")
       vbox2.pack_start(check, True, True, 0)
       check.connect("toggled", self.entry_toggle_visibility, self.phonenumber)
       check.set_active(True)
       check.show()

       # Definition des boutons
       bbox = gtk.HButtonBox ()
       vbox.pack_start(bbox, False, False, 0)
       bbox.set_layout(gtk.BUTTONBOX_END)

       button = gtk.Button("Annuler")
       button.connect("clicked", lambda w: gtk.main_quit())
       bbox.add(button)

       appliquer = gtk.Button("Envoyer")
       appliquer.connect("pressed", self.on_change_text)
       bbox.add(appliquer)


       button.set_flags(gtk.CAN_DEFAULT)
       button.grab_default()
       window.show_all()

       window.show()

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

if __name__ == "__main__":
   toto = EntryExample()
   main()

Coluche : "Bite" c'est un gros mot, même si c'est une petite
Consultant e-commerce
Étude et realisation
Optimisation, maintenance

Hors ligne

#2 Le 29/05/2008, à 21:49

Clop'

Re : [pygtk] Mise a jour d'un gtk.Entry

Bonsoir,

Je n'ai pas vraiment de réponse mais peut-être une piste... Gtk ne rafraichirait-il pas la fenêtre qu'à la fin du callback? Histoire d'optimiser l'affichage je pense... Une solution (si le problème vient de là) serait une fonction pour forcer le rafraîchissement de la fenêtre. Gtk a-t'il cela?


----------------------
Linux on the Root , un site qu'il fait bon feuilleter!
----------------------
PyQtRadio, un lecteur de webradio simple et léger! Installation multi-distrib'

Hors ligne

#3 Le 30/05/2008, à 09:38

elfoiros

Re : [pygtk] Mise a jour d'un gtk.Entry

J'ai trouvé ça mais mon probleme persiste.

http://www.pygtk.org/docs/pygtk/gdk-functions.html#function-gdk--flush

Je continu la quête du grale smile


Coluche : "Bite" c'est un gros mot, même si c'est une petite
Consultant e-commerce
Étude et realisation
Optimisation, maintenance

Hors ligne