Gtk und threads oder gtk.idle_add

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

Gtk und threads oder gtk.idle_add

Beitragvon monocult » Donnerstag 31. März 2005, 10:18

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()   
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 31. März 2005, 16:37

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 Modvoice
Gast

Beitragvon Gast » Donnerstag 31. März 2005, 17:39

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:

Beitragvon monocult » Donnerstag 31. März 2005, 17:41

ich wars (Login vergessen)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 31. März 2005, 19:00

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 Modvoice
monocult
User
Beiträge: 37
Registriert: Donnerstag 31. März 2005, 09:55
Wohnort: hennef
Kontaktdaten:

Beitragvon monocult » Donnerstag 31. März 2005, 20:03

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:

Beitragvon ProgChild » Sonntag 10. April 2005, 13:25

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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder