Pages : 1
#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
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
Coluche : "Bite" c'est un gros mot, même si c'est une petite
Consultant e-commerce
Étude et realisation
Optimisation, maintenance
Hors ligne