Gtk und threads oder gtk.idle_add

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

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()	
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

ich wars (Login vergessen)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

super (war klar das das so einfach ist)

aber jetzt kann ich ja beruhigt schlafen ;-)

Danke
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

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()

Antworten