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/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