Glade - nach klick auf (X) kein Inhalt mehr

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

habe leider noch nicht soviel Erfahrung mit Python.

Und im Moment habe ich ein für mich unlösbares Problem:
Ich habe eine kleine Anwendung geschrieben bei der ich mich von dieser Idee inspirieren hab lassen: http://www.b.shuttle.de/b/humboldt-os/python/.
Also eigentlich ist das ganz simpel und funktioniert auch wunderbar.
Jetzt zum eigentlichen Problem.
Ich lasse ein Fenster aufgehen, wo man einen Wert einstellen kann.
Dieses Fenster kann ich über 2 Methoden schließen.
1. Methode auf den von mir eingefügten Abbrechen Button klicken.
2. Methode auf das (X) klicken.
Wenn ich allerdings die 2. Methode benutzte und danach versuche das Fenster mit der Methode show() wiederherzustellen, dann funktioniert garnichts mehr.
Also alle Buttons und so so sind aus dem Fenster verschwunden.

Hier mein Glade Interface: http://paste.pocoo.org/show/159536/

Hier das Haupt-Skript: http://paste.pocoo.org/show/159537/

Und hier die Counter-Klassen:

Code: Alles auswählen

class countersimple:
	def __init__(self):
		self.number=0

	def delete(self):                           
		self.number=0

	def countup(self):  
		self.number=self.number+1

	def read(self):
		return self.number

class counteradvanced(countersimple):
	def __init__(self):
		countersimple.__init__(self)

	def countdown(self):
		self.number=self.number-1

	def setnumber(self,number):
		self.number=number
So ich hoffe das passt so, ich wollte eigentlich die Dateien direkt hochladen, geht hier aber antscheinend nicht.

Vielen Dank schonmal fürs Lesen und noch ein frohes Weihnachtfest
Maxi

Edit (BlackJack): Quelltext ausgelagert.
BlackJack

@maxi_king_333: Was als erstes ins Auge springt ist, dass 'on_setwindow_destoy' != 'on_setwindow_destroy_event'. Man muss die Handler schon richtig verbinden. ;-)

Dann ist 'destroy' auf `GObject` schon zu spät, zu dem Zeitpunkt wo dass aufgerufen wird, ist das Widget schon zerstört. Das richtige Ereignis wäre `delete_event` auf dem Widget. Und bei dem Handler musst Du zwingend `True` zurückgeben, wenn Du verhindern willst, dass das Widget zerstört wird.

Die '\' am Zeilenende sind übrigens nicht nötig, wenn es noch Klammern irgendeiner Art gibt, die noch nicht geschlossen wurden.

Einrücken sollte man mit vier Leerzeichen pro Ebene und nicht mit Tabs. Und Klassennamen fangen per Konvention mit einem Grossbuchstaben an und werden in "CamelCase" geschrieben.

Die Methodennamen auf den Zählern sind nicht so glücklich gewählt. `read()` wäre eher ein `get()`, `delete()` löscht nichts sondern setzt zurück, also `reset()`, und bei `setnumber()` würde ich das "number" weglassen.

Wenn man dem `SimpleCounter` noch eine `__iter__()`-Methode verpasst, die einfach nur das Exemplar selbst zurückliefert und `countup()` in `next()` umbenennt, dann sind `SimpleCounter`-Exemplare "iterable", können also zum Beispiel in ``for``-Schleifen verwendet werden. `countdown()` sollte man dann konsequenterweise in `previous()` umbenennen. Auf jeden Fall gehören in `countup()` und `countdown()` jeweils ein Unterstrich zwischen die beiden Worte. `countup()` ist schwer zu lesen, und `countdown()` hat ja sogar als ein Wort eine Bedeutung, die sich etwas von `count_down()` unterscheidet.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

schonmal Vielen Vielen Dank für die schnelle und gute Antwort.
Auf die Tabs und diesen ganzen groß und klein schreib Kram. werde ich in zukünftigen Projekten achten, aber hier möchte ich die erstmal so lassen, da ich nicht alles umschreiben möchte.
Mit den Event habe ich es noch nicht so, da gibt es z.B. das von den Buttons fürs klicken, ich dachte eigentlich "on_clicked" es ist aber "on_pressed", da verstehe ich irgendwie den Sinn nicht.
Nun bleibt noch ein Frage, die sich aus Deiner Antwort ergeben hat. Wird das About-Fenster so richtig zerstört, ich brauche es ja eigentlich danach nicht mehr?

Code: Alles auswählen

	def on_about_destroy(self,widget):
		self.aboutdialog.destroy() 
		self.mainwindow.show()
Viele Grüße
Maxi
Antworten