Seite 1 von 1

Popup Position

Verfasst: Donnerstag 6. August 2009, 15:01
von rhersel
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)

Verfasst: Donnerstag 6. August 2009, 15:13
von EyDu
Du darfst "get_popup_position" beim Erstellen den Popups noch nicht aufrufen.

Verfasst: Donnerstag 6. August 2009, 15:28
von rhersel
Das verstehe ich nicht. Wann soll ich es denn sonst aufrufen? Die Koordinaten für das Popup werden doch nur einmal beim Erstellen gebraucht.

Verfasst: Donnerstag 6. August 2009, 15:37
von EyDu
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.

Verfasst: Freitag 7. August 2009, 10:30
von rhersel
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?

Verfasst: Freitag 7. August 2009, 11:52
von EyDu
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])

Verfasst: Freitag 7. August 2009, 12:26
von rhersel
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.