Seite 1 von 1

Gtk und threads oder gtk.idle_add

Verfasst: Donnerstag 31. März 2005, 10:18
von monocult
Ich habe mich Grade mal angemeldet da das bestimmt nicht meine letzte Frage sein wird.

Ich bekomme einfach kein Gui update hin was z.B. bei einem Progressbar ziemlich blöde ist wen er nur von 0 zu 1 springt.

Schon mal jetzt Danke für eure Hilfe.

Code: Alles auswählen

#!/usr/bin/env python

import gtk
import gtk.glade
import time

class gui: 

	def __init__(self): 
		self.wTree=gtk.glade.XML ("threadtest.glade")
		self.wTree.signal_autoconnect(self) 
	
	def startprogress(self):	
		ip=0.0
		
		for i in range(10):
			ip=ip+0.1
			self.wTree.get_widget("progressbar").set_fraction(ip)
			print ip
			time.sleep(0.2)
			
	def on_button1_clicked(self,widget):
		   self.startprogress()
		
	def gtk_main_quit(self,widget):
		 gtk.main_quit()	
	
gui()
gtk.main()	

Verfasst: Donnerstag 31. März 2005, 16:37
von Leonidas
Vorschlag:

Code: Alles auswählen

#!/usr/bin/env python

import gtk, gobject
import gtk.glade
import time

class gui:

    def __init__(self):
        win = gtk.Window()
        win.set_border_width(12)
        win.connect('destroy', gtk.main_quit)
        vbox = gtk.VBox()
        vbox.set_spacing(12)

        self.pbar = gtk.ProgressBar()
        vbox.pack_start(self.pbar)
   
        hbox = gtk.HBox()
        button = gtk.Button(stock=gtk.STOCK_EXECUTE)
        button.connect('clicked', self.on_button1_clicked)
        hbox.pack_start(button)

        vbox.pack_start(hbox)
   
        win.add(vbox)
        win.show_all()
        
        self.gen = self.startprogress()
   
    def startprogress(self):   
        ip=0.0
       
        for i in range(10):
            ip=ip+0.1
            print ip
            gobject.idle_add(self.pbar.set_fraction, ip)
            yield None
           
    def on_button1_clicked(self,widget):
           self.gen.next() 
   
gui()
gtk.main()

Verfasst: Donnerstag 31. März 2005, 17:39
von Gast
ok soweit.

mit

Code: Alles auswählen

gobject.idle_add(self.pbar.set_fraction, ip)
yield None
halte ich die schleife an um den gtk.mainloop zu vollenden. Beim nächsten Aufruf der Funktion wird die schleife weitergeführt.

Aber das bedeutet ja auch das der mainloop auf einen event wartet der die schleifen Funktion mit der schleife neu aufruft.

ich würde es lieber so haben

Code: Alles auswählen

for i in range(10):
			gobject.idle_add(self.pbar.set_fraction, ip)
			time.sleep(0.2)
			--- gui update ---
ich hoffe ich stehe nicht voll aufm Schlauch :-)

Edit (Leonidas): Code in Python Tags gesetzt.

Verfasst: Donnerstag 31. März 2005, 17:41
von monocult
ich wars (Login vergessen)

Verfasst: Donnerstag 31. März 2005, 19:00
von Leonidas
Mein Hirn: kreisch, schepper, wühl... da war doch was! Und ja tatsächlich:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import gtk, gobject
import time

class Gui(object):
    def __init__(self):
        win = gtk.Window()
        win.set_border_width(12)
        win.connect('destroy', gtk.main_quit)
        vbox = gtk.VBox()
        vbox.set_spacing(12)

        self.pbar = gtk.ProgressBar()
        vbox.pack_start(self.pbar)
   
        hbox = gtk.HBox()
        button = gtk.Button(stock=gtk.STOCK_EXECUTE)
        button.connect('clicked', self.on_button1_clicked)
        hbox.pack_start(button)

        vbox.pack_start(hbox)
   
        win.add(vbox)
        win.show_all()
        
    def startprogress(self):
        ip = self.pbar.get_fraction()
        ip += 0.1
        if ip <= 1.0:
            self.pbar.set_fraction(ip)
            return True
        else:
            return False
           
    def on_button1_clicked(self,widget):
           gobject.timeout_add(200, self.startprogress)
   
Gui()
gtk.main()

Verfasst: Donnerstag 31. März 2005, 20:03
von monocult
super (war klar das das so einfach ist)

aber jetzt kann ich ja beruhigt schlafen ;-)

Danke

Verfasst: Sonntag 10. April 2005, 13:25
von ProgChild
Es geht auch noch ein bisschen anders... :)

Code: Alles auswählen


#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import gtk, gobject
import time

class Gui(object):
    def __init__(self):
        win = gtk.Window()
        win.set_border_width(12)
        win.connect('destroy', gtk.main_quit)
        vbox = gtk.VBox()
        vbox.set_spacing(12)

        self.pbar = gtk.ProgressBar()
        vbox.pack_start(self.pbar)
   
        hbox = gtk.HBox()
        button = gtk.Button(stock=gtk.STOCK_EXECUTE)
        button.connect('clicked', self.on_button1_clicked)
        hbox.pack_start(button)

        vbox.pack_start(hbox)
   
        win.add(vbox)
        win.show_all()
       
    def startprogress(self):
        ip=0.0
       
        for i in range(10):
            ip=ip+0.1
            self.pbar.set_fraction(ip)
            while gtk.events_pending():
                gtk.main_iteration()

            print ip
            time.sleep(0.2)
           
    def on_button1_clicked(self,widget):
        self.startprogress()
   
Gui()
gtk.main()