GTK Graph

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Bax
User
Beiträge: 5
Registriert: Dienstag 18. November 2008, 20:08

Hallo miteinander,

ganz simples Problem (schätze ich mal):
Ich habe mir ein GUI mit Glade zusammengeclickt, funktioniert alles tip top. Nur wenn ich meinen "RUN Button" im GUI clicke startet mein programm und ist dann für sicher mehrere stunden beschäftigt. Wenn ich jetzt ein anderes Fenster über mein GUI schiebe, dann verschwindet der ganze Inhalt. Dasselbe passiert mit plots die während dem Programm gezeichnet werden.. Die sind dann weg bis sie wieder explizit vom python code aktualisiert werden... Wie kann man das verhindern?

Hier noch ein (sinnfreies) pseudo-beispiel dafür:

Code: Alles auswählen

import gtk
import gtk.glade
import time
from pylab import *

xml = gtk.glade.XML('pseudo.glade')
window = xml.get_widget('window')
button = xml.get_widget('button')
window.show()


ion()
def on_button_clicked(self):
	for i in range(1,10):
		plot(range(i),'k-')
		time.sleep(3)
	
button.connect('clicked',on_button_clicked)
gtk.main()
Dankeschön schon mal im Voraus!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Indem man kein ``time.sleep()`` verwendet, was dazu führt dass der Thread der das Interface aktualisiert blokiert und logischerweise das Interface nicht aktualisieren kann.

Dazu würde man das Plotten in eine Funktion verschieben die von ``gobject.timeout_add()`` asgeführt wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bax
User
Beiträge: 5
Registriert: Dienstag 18. November 2008, 20:08

hmmm.. das "time.sleep" hab ich bloss eingeführt um das problem zu verdeutlichen... in wirklichkeit passiert da natürlich sinnvoller code der halt bis zu einer stunde rechenzeit benötigt..

werde mal gobject.timeout_add() googeln...

das eigentliche problem ist ja nicht dass ich auf den neuen plot für den nächsten iterationsschritt warten muss (das wäre mir ja klar) sondern dass bis zum nächsten iterationsschritt der plot gelöscht wird sobald ich ein anderes fenster darüberschiebe.

falls ich das richtig verstehe: mit gobject.timeout_add(250,plotfunktion)
würde die plotfunktion 4 mal pro sekunde ausgeführt?
das wäre bei aufwändigen plots ja irgendwie doof, v.a. weil er sich nur stündlich ändern würde..?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bax hat geschrieben:das eigentliche problem ist ja nicht dass ich auf den neuen plot für den nächsten iterationsschritt warten muss (das wäre mir ja klar) sondern dass bis zum nächsten iterationsschritt der plot gelöscht wird sobald ich ein anderes fenster darüberschiebe.
Ich sagte dir ja dass der GUI-Thread blokiert und somit die UI nicht auffrischen kann.
Bax hat geschrieben:falls ich das richtig verstehe: mit gobject.timeout_add(250,plotfunktion)
würde die plotfunktion 4 mal pro sekunde ausgeführt?
das wäre bei aufwändigen plots ja irgendwie doof, v.a. weil er sich nur stündlich ändern würde..?
Du hannst ja das Intervall frei wählen und selbst wenn der Callback ausgeführt wird musst du ja nicht zwingend plotten, wenn es keine Änderungen gibt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Bax
User
Beiträge: 5
Registriert: Dienstag 18. November 2008, 20:08

nun gut.. es wäre für meine zwecke eben wichtig dass ich auch schon in den plots rumzoomen könnte etc auch wenn das programm noch nicht zu ende gelaufen ist.
dann starte ich halt einen separaten thread der das plotten in einer schlaufe erledigt (und halt nur der steckenbleibt bis ich das fenster schliesse...)
bin noch relativ neu mit python und bei matlab war sowas eben überhaupt kein problem.
dasselbe gilt für mein GUI, da stehen bis zu 50 parameter drin die ich dann für mehrere tage nicht mehr zu sehen bekomme wenn mein algorithmus so lange läuft?
Klingt irgendwie merkwürdig..
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Bax hat geschrieben:nun gut.. es wäre für meine zwecke eben wichtig dass ich auch schon in den plots rumzoomen könnte etc auch wenn das programm noch nicht zu ende gelaufen ist.
dann starte ich halt einen separaten thread der das plotten in einer schlaufe erledigt (und halt nur der steckenbleibt bis ich das fenster schliesse...)
bin noch relativ neu mit python und bei matlab war sowas eben überhaupt kein problem.
dasselbe gilt für mein GUI, da stehen bis zu 50 parameter drin die ich dann für mehrere tage nicht mehr zu sehen bekomme wenn mein algorithmus so lange läuft?
Klingt irgendwie merkwürdig..
Wieso ist das Merkwürdig? Innerhalb eines Threads läuft nunmal nur eine Sache gleichzeitig. Wenn dir das nicht gefällt musst du einen weiteren Thread verwenden. Alternativ könntest du sowas in deinen Loop einbauen. Alternativ könntest du auch sowas verwenden. Aber das verwenden eines separaten Threads ist klar die bessere Idee.

Es wird wohl langsam mal Zeit das jemand ein PyGTK & Threads Tutorial schreibt...
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Antworten