Drawing Area in Box einbinden

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
kable
User
Beiträge: 7
Registriert: Mittwoch 13. September 2006, 09:22

Hallo!

Mein Problem ist Folgendes:
Ich habe ein neues Fenster erstellt und es mit Boxen eingeteilt. In eine dieser Boxen möchte ich jetzt eine Drawing Area hineinbringen, damit dort während des Programmablaufs etwas gezeichnet wird. Leider habe ich in den Tutorials nur erfahren, wie man Drawing Areas in einzelne Fenster einbaut, nicht als Widget in eine Box.

Ist mein Vorhaben überhaupt möglich, oder geht das gar nicht?
BlackJack

Das sollte bei einer Box nicht viel anders sein als bei einem Fenster.
kable
User
Beiträge: 7
Registriert: Mittwoch 13. September 2006, 09:22

Alles was ich bisher probiert habe, hat leider nicht funktioniert...

Das Problem liegt glaube ich darin, dass ich keinen Graphics Context erstellen kann, ohne die Drawing Area vorher einem Fenster hinzugefügt zu haben.
Wenn ich nämlich die Drawing Area nicht hinzufüge
(self.window.add(self.drawing_area)
self.window.show()
->weglassen)

bekomme ich bei dem Befehl "self.gc = self.drawable.new_gc()" immer den Fehler, dass ein "NoneType Object" kein Attribut "new_gc" hat.

Füge ich die Drawing Area hingegen dem Fenster hinzu, scheint es zu funktionieren, aber beim Ausführen des Programms, sind alle anderen Elemente(Menü, Buttons) nicht mehr zu sehen.

Vielleicht mache ich auch irgendeinen grundlegenden Fehler...
Die größte Hilfe für mich wäre ein Beispielprogramm. Vielleicht erbarmt sich jemand so etwas zu schreiben :wink:
BlackJack

Wie wär's wenn Du einfach mal ein minimales Beispiel schreibst. Also Fenster, `VBox` oder `HBox` rein, dort dann zum Beispiel einen Button und das `DrawingArea` hinzufügen und uns den Quelltext plus Fehlermeldung zeigen.

Aus Deinem letzten Beitrag wird zum Beispiel nicht ersichtlich wo `self.drawable` herkommt und warum das `None` ist. Ich vermute mal Du rufst eine Funktion oder Methode auf, von der Du fälschlicherweise denkst, sie gäbe etwas zurück. Aber ohne Quelltext zu sehen können wir hier nur raten.
kable
User
Beiträge: 7
Registriert: Mittwoch 13. September 2006, 09:22

Als ich das Minimalbeispiel geschrieben hab ist mir klargeworden, dass es so eigentlich garnicht funktionieren kann. Aber wie man es anders macht, weiss ich auch nicht.
Hier ist der Quelltext:

Code: Alles auswählen

import gtk
import pygtk

class fenster:
	
	
	def delete_event(self, widget, event, data=None):
		print "delete event occured"
		return False
	
	def destroy(self, widget, data=None):
		gtk.main_quit()
		
	def __init__(self):
		
		#Fenster erstellen
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.window.connect("delete_event", self.delete_event)
		self.window.connect("destroy", self.destroy)
		self.window.set_default_size(640, 480)
		
		#Boxen erstellen
		box1 = gtk.VBox(homogeneous=False, spacing=0)
		box2 = gtk.HBox(homogeneous=False, spacing=0)
		
		#Button erstellne
		button = gtk.Button('Knopf')
		box1.pack_start(button, False, False, 0)
		button.show()
		
		#Problembereich: Drawing Area
		self.drawing_area = gtk.DrawingArea()
		self.drawing_area.set_size_request(300, 300)
		self.drawing_area.show()
		
		self.window.add(self.drawing_area)
		self.window.show()
		
		box2.pack_start(self.drawing_area, False, False, 0)
		
		self.drawable=self.drawing_area.window
		self.gc = self.drawable.new_gc()
		
		#Boxen in Window einbinden+zeigen
		self.window.add(box1)
		box1.pack_start(box2, False, False, 0)
		box1.show()
		box2.show()
		self.window.show()
		
	def main(self):
		gtk.main()
		
start = fenster()		
start.main()
Durch die Befehle:
self.window.add(self.drawing_area)
self.window.show()

kann ja später keine Box mehr ins Fenster eingefügt werden, da dies nun schon belegt ist.

Werden die beiden weggelassen, kommt aber bei dem Befehl:
self.gc = self.drawable.new_gc()
der Fehler
AttributeError: 'NoneType' object has no attribute 'new_gc'

Naja, ich hoffe ihr werdet aus dem Quelltext schlauer als ich...
BlackJack

kable hat geschrieben:Durch die Befehle:
self.window.add(self.drawing_area)
self.window.show()

kann ja später keine Box mehr ins Fenster eingefügt werden, da dies nun schon belegt ist.
Genau, deshalb sollte man das auch lassen. ;-)
Werden die beiden weggelassen, kommt aber bei dem Befehl:
self.gc = self.drawable.new_gc()
der Fehler
AttributeError: 'NoneType' object has no attribute 'new_gc'
Das `window` gibt es erst wenn das Fenster auch wirklich existiert. Du musst die beiden Zeilen nur ans Ende der Methode verschieben.
kable
User
Beiträge: 7
Registriert: Mittwoch 13. September 2006, 09:22

So eine einfache Änderung mit so einer großen Wirkung :)

Danke vielmals für die Hilfe
Antworten