gtk.main_quit() klappt nicht immer

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Hi,
folgendes Problem:

Manchmal (nicht reproduzierbar) wird ein 'gtk.main()' nicht verlassen nachdem ich 'gtk.main_quit()' ausführe. Warum?
Kann ich irgedwie abfragen ob ich mich noch in der mainloop befinde und falls ja (evtl mit einer while Schleife) so lange 'gtk.main_quit()' ausführen bis es klappt?
Ich schick mal keinen Code mit, weil das ganze recht umfangreich ist, und wenn ichs versuch in einer einfachen Testdatei zu provozieren, klappts jedesmal. (Vorführeffekt)

Gruß Tom
lunar

@wellnestom: Ohne Quelltext kann man nur raten ... ich würde mal darauf tippen, dass der Aufruf von "gtk.main_quit()" in einer bestimmten Situation aufgrund eines Fehlers in Deinem Quelltext gar nicht ausgeführt wird. Vielleicht rufst Du "gtk.main()" versehentlich auch mehrfach auf, so dass darauf folgende Aufrufe von "gtk.main_quit()" immer nur die innerste Schleife beenden.

Versuche am besten, das Original schrittweise solange zu reduzieren, bis der Fehler verschwindet. Das sollte Dich mehr oder weniger direkt zur Ursache führen.
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

So einfach ist das gar nicht. gtk.main() kann eigentlich nur einmal aufgerufen werden, und der fehler verschwindet auch nicht wenn ich 20(!) gtk.main_quit()'s hintereinanderstelle.
Aufgerufen wird der gtk.main_quit() auch, denn es werden ja auch sämtliche Anweisungen dannach ausgeführt. z.B. auch window.destroy()! Dannach kann ich das Programm nur noch mit Strg+c abbrechen.

Kann ich nicht abfragen ob ich mich in der Schleife befinde?

Tom
BlackJack

@wellnestom: Du hast *danach* noch Aufrufe, die was an der GUI machen? Das ist zumindest ungewöhnlich.
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Stimmt, hab das window.destroy() und ein paar print()'s mal zu testzwecken NACH den gtk.main_quit gesetzt, um zu sehen ob die funktion in der das quit aufgerufen wird auch bis dahin und darüber hinaus durchläuft.
In meinem Programm befinden sich insgesamt 4 gtk.main() Schleifen.
gtk.main - Benutzer gibt was ein - gtk.main_quit, Programm berechnet, neue gtk.main Schleife .....
Es sind immer andere Fenster die ich mit Glade erstellt hab. Und nur beim dritten gibts manchmal c.a. 1 von 10 mal dieses Problem. Obwohl die Funktion in der das gtk.main_quit() steht immer die selbe ist.
Und da die Schleife nicht beendet wird, gehts dann im Programm nicht weiter....

Code: Alles auswählen

if do == 'weiter':
	gtk.main_quit()
	window.destroy()
	print('Fenster zu')
BlackJack

@wellnestom: Das kann aber auch bedeuten, dass eine der anderen Hauptschleifen nicht beendet wurde. Warum musst Du da überhaupt mehrere von starten?
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Die anderen werden beendet.
Zwischen den einzelnen Fenstern laufen ziemlich komplexe Berechnungen. Dann gibts wieder ein Fenster das mit den Ergebnissen aus den Berechnungen 'Dekoriert' wird, und weitere Benutzereingaben sind erforderlich.
Die Berechnungen zwischen den Schleifen werden ja gemacht, nur nach dem dritten Fenster gehts manchmal nicht weiter. Und nach Strg+c sagt er mir ja das in der Zeile in der gtk.main() steht abgebrochen wurde.
Hab auch schon folgendes ohne Erfolg versucht (Bitte nicht lachen, ich versuch ja nur dem ganzen auf den Grund zu gehen)

Code: Alles auswählen

	if do == 'weiter':
		i=0
		while i < 100:
			gtk.main_quit()
			i=i+1
		window.destroy()
Ich versteh nicht warum das window.destroy() ausgeführt wird, aber 100x gtk.main_quit() manchmal nicht aus der Schleife rausführen. Wär das Problem immer da..... Ist aber nur manchmal, und nicht reproduzierbar. :K
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich würde in einem Prozess nicht die GTK-Mainloop mehrmals starten und beenden sondern einfach weiterlaufen lassen, auch wenn grad kein Fenster dargestellt wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Genau da liegt das Problem! Ich möchte die mainloop eben NICHT weiterlaufen lassen. Ich will aus der Schleife raus damit ich im Programm fortfahren kann.
Und entweder ich mach da noch was nicht ganz richtig, oder es muß wohl ein Bug in Python oder Gtk sein (weil das Problem nur sporadisch auftritt).

Ich hab mittlerweile schon von anderen gehört die das selbe Problem haben. Nur niemand kennt eine Lösung.
lunar

@wellnestom: Es besteht doch auch die Möglichkeit, das Programm innerhalb der Hauptschleife fortzuführen. Das würde dieses Probleme, für die ja ohnehin offenbar niemand eine Lösung hat, ja vollständig vermeiden.
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Leider bin ich noch nicht sooo das Python Genie :wink:
Um solche Umbauarbeiten 'richtig' hinzubekommen müsste ich schon jemanden haben der sich damit super auskennt und mal nen Tag oder zwei Zeit hat um mit mir ein paar tausend Programmzeilen durchzugehen und mir das zu erklären........
Antworten