[erledigt] Einfaches Beispiel mit Threads

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
paedubucher
User
Beiträge: 28
Registriert: Donnerstag 29. Juni 2006, 18:29
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 27. Juli 2006, 23:12

Hallo allerseits

Ich wollte mich heute mal an die Themen Threading und PyGTK heran wagen. Dazu entwickelte ich ein kleines Skript, welches ungefähr folgende Funktionalität haben soll;
- Ich starte das Skript
- Ein GUI mit zwei Buttons [Start ] [Stop] erscheint
- Der Benutzer klickt auf [Start], nun wird irgendwas auf die Konsole ausgegeben (wieder und immer wieder)
- sobald der Benutzer auf [Stop] klickt, sollen die Konsolenausgaben stoppen

Der Code dazu:

Code: Alles auswählen

import gtk
import pygtk
import threading

class Gui(threading.Thread):

  def delete_event(self, widget, event, data = None):
    gtk.main_quit()
    return False
    
  def start_work(self, widget, data = None):
    print 'Klick auf Start'
    self.worker = Worker()
    self.worker.start()
    
  def stop_work(self, widget, data = None):
    print 'Klick auf Stop'
    self.worker.interrupted = True
    del self.worker

  def __init__(self):
    threading.Thread.__init__(self)
    
  def run(self):
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_title('Multi-Threading')
    
    self.box = gtk.HBox(False, 5)
    self.window.add(self.box)
    
    self.btnStart = gtk.Button("Start")
    self.btnStart.connect("clicked", self.start_work)
    self.box.pack_start(self.btnStart, True, True, 5)
    
    self.btnStop = gtk.Button("Stop")
    self.btnStop.connect("clicked", self.stop_work)
    self.box.pack_start(self.btnStop, True, True, 5)
    
    self.window.show_all()
    self.window.connect("delete_event", self.delete_event)
    self.window.show()
    
    gtk.main()
    
class Worker(threading.Thread):

  def __init__(self):
    threading.Thread.__init__(self)
    self.interrupted = False
    
  def run(self):
    while(self.interrupted == False):
      print '... working ...'
    else:
      print '!!! STOP !!!'
      
if __name__ == '__main__':
  gui = Gui()
  gui.start()
Wenn ich das Skript nun starte und auf [Start] klicke, passiert nichts. Schliesse ich das GUI jedoch, so beginnen plötzlich die Ausgaben.
Mein Verdacht; gtk.main() startet irgend einen Thread, der meinen ganzen Rest blockiert.

Hat jemand von euch eine Lösung zu meinem Problem?
Zuletzt geändert von paedubucher am Donnerstag 27. Juli 2006, 23:17, insgesamt 1-mal geändert.
Benutzeravatar
paedubucher
User
Beiträge: 28
Registriert: Donnerstag 29. Juni 2006, 18:29
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 27. Juli 2006, 23:17

Ups, die Lösung liefere ich gleich nach:

Einfach:

Code: Alles auswählen

 gtk.gdk.threads_init() # GTK threadingfähig machen
vor

Code: Alles auswählen

gtk.main()
einhängen, damit GTK "threadfähig" wird
Antworten