Comment puis-je mettre à jour/redessiner un GTK Widget (GTKLabel) en interne sans une touche d'événement à l'aide de python?

J'ai un peu de code ci-dessous qui tente de mettre à jour un GTK l'élément Label. Je suis, y compris deux fichiers: le fichier d'interface utilisateur et le py fichier.

Fichier d'INTERFACE utilisateur:

<glade-interface>
  <widget class="GtkWindow" id="ApplicationFrame">
    <property name="width_request">320</property>
    <property name="height_request">240</property>
    <property name="visible">True</property>
    <property name="events">GDK_KEY_PRESS_MASK</property>
    <property name="title" translatable="yes">Simple</property>
    <property name="resizable">False</property>
    <property name="window_position">center-always</property>
    <property name="default_width">320</property>
    <property name="default_height">240</property>
    <property name="decorated">False</property>
    <property name="gravity">center</property>
    <child>
      <widget class="GtkFixed" id="layout">
        <property name="width_request">320</property>
        <property name="height_request">240</property>
        <property name="visible">True</property>
        <child>
          <widget class="GtkLabel" id="l1">
            <property name="width_request">320</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="xalign">0</property>
            <property name="label" translatable="yes">l1</property>
          </widget>
          <packing>
            <property name="y">43</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>

Fichier Python

import os
from time import sleep as wait
import gtk as gtk
import gtk.glade as glade
import gobject
class Application(object):
def __init__ (self):
self.glade = glade.XML("simple.ui")
self.setup_ui()
def setup_ui (self):
self.window = self.glade.get_widget("ApplicationFrame")
self.l1 = self.glade.get_widget("l1")
self.names = {'l1' : self.l1}
self.all = [self.l1]
gobject.timeout_add(1000,self.display_me)
gobject.timeout_add(100,self.do_something_that_takes_a_while)
self.window.add_events(gtk.gdk.KEY_PRESS_MASK)
self.window.connect("key-press-event", self.handler)
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
self.window.show()
def get_signal (self,widget,event):
keyname = gtk.gdk.keyval_name(event.keyval)
ctrl = event.state & gtk.gdk.CONTROL_MASK
alt = event.state & gtk.gdk.MOD1_MASK
shift = event.state & gtk.gdk.SHIFT_MASK
name = []
if ctrl and keyname not in ["Control_L","Control_R"]: 
name.append("CTRL")
if alt and keyname not in ["Alt_L","Alt_R"]:
name.append("ALT")
if shift and keyname not in ["Shift_L","Shift_R"]:
name.append("SHIFT")
name.append(keyname)
name = "+".join(name)
return name
def handler (self,widget,event):
name = self.get_signal(widget,event)
if name.lower() in ['ctrl+x','ctrl+c','alt+q']:
self.destroy()
def main(self):
gtk.main()
def delete_event (self,widget=None,event=None,data=None):
return False
def destroy (self,widget=None,data=None):
gtk.main_quit()
def get (self,item):
if isinstance(item, str): 
if item in self.names:
item = self.names[item]
retval = None
if hasattr(item,"text"):
retval = item.text()
elif hasattr(item,"get_label"):
retval = item.get_label()
return retval
def set (self,item,text='',font=None):
print 'Setting...'
if isinstance(item, str): 
if item in self.names:
item = self.names[item]
retval = None
if font == None and hasattr(self,"page") and hasattr(self.page,"NORMAL_FONT"): 
font = self.page.NORMAL_FONT
if hasattr(item,"setText"):
retval = item.setText(text)
elif font == None:
if hasattr(item,'set_text'):
retval = item.set_text(text)
elif hasattr(item,"set_label"):
retval = item.set_label(text)
if hasattr(item,"modify_font") and font != None:
item.modify_font(font)
item.queue_draw()
self.try_to_update(item)
print 'done'
return retval
def try_to_update (self,item):
"""
do something here to update the visual screen????
"""
print str(self)
def do_something_that_takes_a_while (self):
timeout = 15
while timeout != 0:
self.set('l1','%s' % timeout)
wait(1)
timeout -= 1
print timeout
return 1
def clean (self):
if item != None:
self.set(item,empty_text)
else:
if hasattr(self,'all'):
for item in self.all:
self.set(item)
def display_me (self):
print str(self)
return True
def __str__ (self):
space = 25
value = '%'+str(space)+'s'
lines = ['\n','-'*79]
if hasattr(self,'all'):
line = []
for obj in self.all:
obj_value = self.get(obj)
line.append(value % obj_value if obj_value != None else '')
#line.append(value % ' ')
lines.append(''.join(line))
lines.append('-'*79)
return '\n'.join(lines)
if __name__ == "__main__":
from time import sleep as wait
SEC = 1
app = Application()
app.main()

Cela devrait être simple, mais je suis complètement à côté de ce que je fais mal. L'élément de l1, n'est pas mis à jour correctement. Je pense que le code à l'intérieur try_to_update est là que j'ai besoin de mettre à jour l'INTERFACE utilisateur, mais je suis à une perte de la fonction j'ai besoin de l'appeler. Quelqu'un peut s'il vous plaît aider?

Merci d'avance!

Juste un style recommandation: type(item) == type('') => type(item) == str => isinstance(item, str)
C'est utile. Merci!
Je n'ai jamais utilisé de multitraitement, mais il ressemble à un SimpleFrame objet est partagé sans suivant le mécanisme décrit dans la documentation.
Compris. Je ne pense pas que le multitraitement est la question. J'ai été en utilisant que pour identifier un processus qui est similaire à ce que je suis en train de faire: quelque chose est la mise à jour de l'affichage indépendant de GTK...mais l'interface graphique elle-même n'est pas réellement mise à jour.
Désolé d'insister, peut-être que je suis mssing quelque chose, mais d'un objet est mis à jour dans un processus qui n'gtk mainloop est en cours d'exécution et la nouvelle valeur est prévu pour être propagées à distance à un processus en cours d'exécution un autre interpréteur python et de générer un événement qui met à jour l'affichage. En regardant la documentation, je ne vois pas ce que ce genre d'interaction est prise en charge sans explicitement la création d'un proxy pour cet objet.

OriginalL'auteur Brian Bruggeman | 2011-12-05