#1 Le 06/11/2008, à 07:28
- figarojuju
Résolu : [Python] Glade (pygtk) et le timer
Bonjour,
je programme un petit programme pour m'amuser sous glade. Voici mon code :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Tue Nov 4 07:23:51 2008 -->
<glade-interface>
<widget class="GtkWindow" id="Whorloge">
<property name="width_request">400</property>
<property name="height_request">200</property>
<property name="visible">True</property>
<property name="title" translatable="yes">Timer Spirotiger</property>
<signal name="destroy" handler="on_Whorloge_destroy"/>
<child>
<widget class="GtkTextView" id="texttime">
<property name="visible">True</property>
<property name="can_focus">True</property>
</widget>
</child>
</widget>
</glade-interface>
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
except:
pass
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer}
self.Fenetre.signal_autoconnect(dic)
self.tZero=time.time()
self.Wext=self.Fenetre.get_widget("texttime")
self.buf=self.Wext.get_buffer()
def fermer(self,widget,donnees=None):
gtk.main_quit()
def boucle(self):
gtk.main()
def startc(self):
self.t=time.time() -self.tZero
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
print self.tt
self.buf.set_text(self.tt)
if __name__=='__main__':
app=C_horloge()
app.boucle()
app.startc()
Pour l'instant, je n'arrive même pas à afficher mon texte dans ma fenêtre...
Auriez-vous des conseils ?
Merci et à bientôt.
Dernière modification par figarojuju (Le 11/11/2008, à 18:10)
Ubuntu: Hardy Heron
Hors ligne
#2 Le 06/11/2008, à 18:22
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Bonjour,
j'ai un peu modifié mon code en temptant de me renseigner sur gobject.timeout_add
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
import threading
import gobject
except:
pass
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer}
self.Fenetre.signal_autoconnect(dic)
self.tZero=time.time()
self.Wext=self.Fenetre.get_widget("texttime")
self.buf=self.Wext.get_buffer()
self.updateur=gobject.timeout_add(1000,self.startc)
def fermer(self,widget,donnees=None):
gtk.main_quit()
def boucle(self):
gtk.main()
def startc(self):
self.t=time.time() -self.tZero
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
print self.tt
self.buf.set_text(self.tt)
if __name__=='__main__':
app=C_horloge()
app.boucle()
Seulement, je n'ai pas de mise à jour du chrono...
Auriez-vous des suggestions ?
Bonne soirée.
Ubuntu: Hardy Heron
Hors ligne
#3 Le 07/11/2008, à 19:23
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Bonjour,
j'ai encore un peu modifié mon code, le chrono fonctionne mais je n'arrive pas à modifier mon textview. Lorsque je ferme ma fenêtre gtk, le terminal m'affiche cependant le chrono qui déroule et je doit faire ctr-c pour terminer le processes.
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
import threading
import gobject
except:
pass
#----------------------------------------------------------------------
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer}
self.Fenetre.signal_autoconnect(dic)
self.tZero=time.time()
self.Wext=self.Fenetre.get_widget("texttime")
self.buf=self.Wext.get_buffer()
def fermer(self,widget,donnees=None):
gtk.main_quit()
def boucle(self):
gtk.main()
def startc(self):
self.t=time.time() -self.tZero
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
self.buf.set_text("coucou")
print self.tt
self.q=threading.Timer(1.0,self.startc)
self.q.start()
#----------------------------------------------------------------------
if __name__=='__main__':
app=C_horloge()
app.boucle()
app.startc()
Qu'en pensez-vous ?
Est-ce possible de modifier une propriété d'un objet de cette manière ?
Bonne soirée.
Ubuntu: Hardy Heron
Hors ligne
#4 Le 07/11/2008, à 20:18
- aleph
Re : Résolu : [Python] Glade (pygtk) et le timer
>figarojuju
A mon avis, tu ne pars pas dans la bonne direction.
Pour ce type de problème, il faut bien faire la distinction entre Python et Python *et" une interface graphique.
Un "timer" en pur Python fonctionne très bien, mais quand on utilise une interface graphique, c'est en quelque sorte l'interface graphique qui prend la main, c'est à dire qui gère les événements et le temps.
Les interfaces graphiques possèdent généralement un contrôle/widget destiné à cet usage, par ex QTimer, pour Qt/PyQt ou wxTimer pour wxWidgets/wxPython. Pour pyGTK, je n'est pas d'expérience.
Cela s'applique aussi à d'autre événements ou instructions temporels, par ex. de type "sleep()" qui lui aussi sera géré au niveau du "toolkit" graphique.
#5 Le 08/11/2008, à 00:45
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Aleph,
merci pour tes remarques judicieuses. Je m'acharnais mais maintenant que tu le dis, effectivement, il semblerait bien que cela fonctionne comme tu le dis...
Bonne soirée
Ubuntu: Hardy Heron
Hors ligne
#6 Le 08/11/2008, à 11:13
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Salut Aleph,
en tenant compte de ta remarque, j'ai cherché et j'ai trouver ceci:
http://sahid.funraill.org/2007/06/06/gt … et-lheure/
Puis j'ai modifié mon code :
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
import threading
import gobject
except:
pass
#----------------------------------------------------------------------
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer}
self.Fenetre.signal_autoconnect(dic)
self.tZero=time.time()
self.Wext=self.Fenetre.get_widget("texttime")
self.buf=self.Wext.get_buffer()
self.startc()
def fermer(self,widget,donnees=None):
gtk.main_quit()
def boucle(self):
TIMER_ID = gobject.timeout_add (1000, self.startc)
def startc(self):
self.t=time.time() -self.tZero
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
self.buf.set_text(self.tt)
self.boucle()
#----------------------------------------------------------------------
if __name__=='__main__':
app=C_horloge()
gtk.main()
Et ça marche !!!
A bientôt, il ne me reste plus qu'à mettre un bel affichage et ce sera mieux...
Ubuntu: Hardy Heron
Hors ligne
#7 Le 08/11/2008, à 12:05
- aleph
Re : Résolu : [Python] Glade (pygtk) et le timer
> figarojuju
Avec un peu d'imagination, on peut à l'aide de timers créer des choses amusantes.
J'avais en son temps, pour le compte de utilisateurs wxPython, créer une application simulant un oscilloscope et l'acquisition de données. C'est vieux, mais cela fonctionne toujours aussi bien avec Python 2.6 et la bibliothèques graphique wxPython. C'est développé sous Windows, mais je sais que cela fonctionnait (fonctionne ?) aussi bien sous OS X que "linux".
http://spinecho.ze.cx/ > oscillo
#8 Le 08/11/2008, à 16:00
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Bon,
après recherche sur la modification du texte :
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
import threading
import gobject
import pango
except:
pass
#----------------------------------------------------------------------
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer}
self.Fenetre.signal_autoconnect(dic)
self.tZero=time.time()
self.Wext=self.Fenetre.get_widget("texttime")
self.buf=self.Wext.get_buffer()
self.startc()
def fermer(self,widget,donnees=None):
gtk.main_quit()
def boucle(self):
self.tag = self.buf.create_tag(None, size=65.0 * pango.SCALE)
self.start, self.end = self.buf.get_bounds()
self.buf.apply_tag(self.tag, self.start, self.end)
TIMER_ID = gobject.timeout_add (1000, self.startc)
def startc(self):
self.t=time.time() -self.tZero
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
self.buf.set_text(self.tt)
self.boucle()
#----------------------------------------------------------------------
if __name__=='__main__':
app=C_horloge()
gtk.main()
Si vous avez des remarques, suggestions, conseils, c'est toujours avec plaisir que je reçois les critiques...
Bon WE
Ubuntu: Hardy Heron
Hors ligne
#9 Le 10/11/2008, à 22:02
- figarojuju
Re : Résolu : [Python] Glade (pygtk) et le timer
Voici la dernière mouture :
#!/bin/python
try:
import pygtk
pygtk.require("2.0")
import time
import gtk
import gtk.glade
import threading
import gobject
import pango
except:
pass
#----------------------------------------------------------------------
class C_horloge:
def __init__(self):
self.gladefile="/home/julien/bin/horloge/chrono.glade"
self.Fenetre=gtk.glade.XML(self.gladefile, "Whorloge")
dic={"on_Whorloge_destroy":self.fermer,"on_start_button_press_event":self.start,"on_pause_button_press_event":self.pause}
self.Fenetre.signal_autoconnect(dic)
self.Waffichage=self.Fenetre.get_widget("texttime")
self.buf=self.Waffichage.get_buffer()
self.truc=0.0
self.t_arret=0.0
self.t_pause=0.0
self.t_cumule=0.0
def start(self,widget,donnees=None):
self.tZero=time.time()
self.test=1
self.truc=0.0
self.t_arret=0.0
self.t_pause=0.0
self.t_cumule=0.0
self.run()
def pause(self,widget,donnees=None):
if self.test==0:
self.t_pause=time.time()-self.t_arret
self.test=(self.test+1)%2
self.boucle()
else:
self.t_cumule=self.t_cumule+self.t_pause
self.t_pause=0.0
self.t_arret=time.time()
self.test=(self.test+1)%2
self.boucle()
def boucle(self):
self.tag = self.buf.create_tag(None, size=65.0 * pango.SCALE)
self.start, self.end = self.buf.get_bounds()
self.buf.apply_tag(self.tag, self.start, self.end)
if self.test==1:
TIMER_ID = gobject.timeout_add (200, self.run)
else:
pass
def run(self):
self.t=time.time() -self.tZero -self.t_cumule-self.t_pause
self.tiTuple=time.gmtime(self.t)
self.tt=time.strftime("%H:%M:%S", self.tiTuple)
self.buf.set_text(self.tt)
self.boucle()
def fermer(self,widget,donnees=None):
gtk.main_quit()
#----------------------------------------------------------------------
if __name__=='__main__':
app=C_horloge()
gtk.main()
et le fichier glade :
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
<!--Generated with glade3 3.4.5 on Mon Nov 10 21:58:05 2008 -->
<glade-interface>
<widget class="GtkWindow" id="Whorloge">
<property name="visible">True</property>
<property name="title" translatable="yes">Timer Spirotiger</property>
<signal name="destroy" handler="on_Whorloge_destroy"/>
<child>
<widget class="GtkVBox" id="vbox1">
<property name="width_request">400</property>
<property name="visible">True</property>
<property name="border_width">2</property>
<child>
<widget class="GtkLayout" id="layout1">
<property name="width_request">450</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<child>
<widget class="GtkTextView" id="texttime">
<property name="width_request">400</property>
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="justification">GTK_JUSTIFY_CENTER</property>
</widget>
</child>
</widget>
</child>
<child>
<widget class="GtkLayout" id="layout2">
<property name="width_request">400</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<child>
<widget class="GtkButton" id="start">
<property name="width_request">90</property>
<property name="height_request">35</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Start</property>
<property name="response_id">0</property>
<signal name="button_press_event" handler="on_start_button_press_event"/>
</widget>
<packing>
<property name="x">105</property>
<property name="y">6</property>
</packing>
</child>
<child>
<widget class="GtkButton" id="pause">
<property name="width_request">90</property>
<property name="height_request">35</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="label" translatable="yes">Pause</property>
<property name="response_id">0</property>
<signal name="button_press_event" handler="on_pause_button_press_event"/>
</widget>
<packing>
<property name="x">212</property>
<property name="y">6</property>
</packing>
</child>
</widget>
<packing>
<property name="position">1</property>
</packing>
</child>
</widget>
</child>
</widget>
</glade-interface>
Bonne soirée
Ubuntu: Hardy Heron
Hors ligne