Popup Position

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Bei der Funktion zur Übergabe der Position eines Popup Menüs erhalte ich die Fehlermeldung:

Code: Alles auswählen

comenu.popup(None, None, self.get_popup_position([widget, self.window]), 1, event.time)     # show context menu
TypeError: func must be a callable object or None
Weiss jemand was an der Funktion falsch ist?
Hier ist der Code (stark vereinfacht):

Code: Alles auswählen

def event_textview_key_press(self, widget, event):
	menu.popup(None, None, self.get_popup_position([widget]), 1, event.time) # show context menu		

def get_popup_position(menu, data):	# return position for popup
	x = 1
	y = 2
	return (x, y, True)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du darfst "get_popup_position" beim Erstellen den Popups noch nicht aufrufen.
Das Leben ist wie ein Tennisball.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Das verstehe ich nicht. Wann soll ich es denn sonst aufrufen? Die Koordinaten für das Popup werden doch nur einmal beim Erstellen gebraucht.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hier rufst du die Funktion auf, was ein Tupel als Ergebnis liefert:

Code: Alles auswählen

menu.popup(None, None, self.get_popup_position([widget]), 1, event.time)
self.get_popup_position([widget]) wird ausgewertet BEVOR menu.popup aufgerufen wird.
Das Leben ist wie ein Tennisball.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Wenn ich die Daten direkt übergebe, kommt die gleiche Fehlermeldung:

Code: Alles auswählen

comenu.popup(None, None, (200,200,True), 1, event.time)
TypeError: func must be a callable object or None
Popup braucht als Parameter eine Function; so steht es auch in der Spezifikation: http://www.pygtk.org/docs/pygtk/class-g ... enu--popup

Aber was mache ich bei der Function verkehrt?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Es steht doch deutlich in der Dokumentation, dass du eine FUNKTION übergeben sollst. Du übergibst das Ergebnis eines FUNKTIONSAUFRUF.

Code: Alles auswählen

menu.popup(None, None, self.get_popup_position, 1, event.time, [widget])
Das Leben ist wie ein Tennisball.
rhersel
User
Beiträge: 105
Registriert: Mittwoch 3. Dezember 2008, 11:29

Ok, jetzt hab ich es:

Code: Alles auswählen

comenu.popup(None, None, self.get_popup_position, 1, event.time, (widget, self.window))

def get_popup_position(self, menu, data):
Danke für den Denkanstoss.
Antworten