Probleme mit Threads und GTK

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
pete123
User
Beiträge: 7
Registriert: Sonntag 13. Mai 2007, 16:49
Kontaktdaten:

Hi,

ich wollte gerade in meiner GTK-Anwendung ein Label alle 10 Sekunden mit einem neuen Wert belegen, also habe ich mir gedacht da sind Threads genau das richtige - aber irgendwas mache ich wohl falsch :/

Ich habe mein Beispiel jetzt so runter gekürzt, dass das Label gar nicht mehr beachtet wird, lediglich ein einfaches Print soll jede Sekunde passieren, aber solange die GUI läuft funktioniert das leider nicht.


Hier mein Code:

Code: Alles auswählen

from math import *
from time import *
import pygtk
from threading import *
pygtk.require("2.0")
import gtk
import gtk.glade


class Temp (Thread):
  def __init__(self):
    Thread.__init__(self)
    self.test=1
    self.gladefile = "temptest.glade"
    self.wTree = gtk.glade.XML(self.gladefile) 
    self.window = self.wTree.get_widget("window1")
    
    if (self.window):
      self.window.connect("destroy", self.qquit) 
       
    dic = {"on_start_clicked" : self.start_threaded}
    self.wTree.signal_autoconnect(dic)

  def qquit(self,widget):
    print "GUI-Quit"
    self.test=0;
    gtk.main_quit(widget)

  def start_threaded(self,widget=None):
    print "thread"
    self.start()
  
  def run(self,widget=None):
    while (1):
      print "hi"
      sleep(1)

if __name__ == "__main__":
  temptest = Temp()
  gtk.main()
und hier die Ausgabe:
python temperaturmessung_mit_ttf103.py
thread
hi
GUI-Quit
hi
hi
hi
hi
hi
hi
hi
Beendet

Nach der ersten Ausgabe von Hi bleibt der Thread quasi stehen, bis ich eben die gui beende, dann läuft er solange weiter bis ich ihn per kill abschieße (beendet)


--> Wo liegt mein Denk-/ bzw. Anwendungsfehler?

Vielen Dank schonmal für eure Hilfe,
Pete
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

pete123 hat geschrieben:Hi,

ich wollte gerade in meiner GTK-Anwendung ein Label alle 10 Sekunden mit einem neuen Wert belegen, also habe ich mir gedacht da sind Threads genau das richtige - aber irgendwas mache ich wohl falsch :/
Man sollte sich Multithreading nicht unnötig antun ;)
http://www.pygtk.org/docs/pygobject/gob ... tions.html
>> gobject.timeout_add ;)

Gruss,
Jonas
pete123
User
Beiträge: 7
Registriert: Sonntag 13. Mai 2007, 16:49
Kontaktdaten:

hmm,
ja so funktioniert es :)

Aber mich würde es trotzdem interessieren warum das oben nicht funktioniert hat, vielleicht braucht man ja irgendwann doch mal echte Threads :)

Danke!
Pete
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Naja das mit dem Zugriff aus mehreren Threads ist nicht ganz so leicht. Ich würde es wie gesagt nach Möglichkeit vermeiden. Zum Beispiel in dem du aus dem zweiten Thread ein Callback der Event Queue des Mainloops hinzufügst. Aber was war ja nicht deine eigentliche frage ;)

Deine Frage wird von den pygtk FAQ beantwortet.,
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

GTK + Threads gehen wie in dem Snippet beschrieben. Aber in der Regel *will* man keine Threads verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten