Seite 1 von 1

CheckButtonItem kann nicht "getoggled" werden

Verfasst: Sonntag 11. Mai 2008, 15:50
von Knilch
Hallo,
ich versuche in dem submenu eines Status Icons 2 CheckButtonItem's reinzubringen, was auch klappt, allerdings kann ich sie nicht "togglen".

Code: Alles auswählen

#!/usr/bin/env python
# test_check.py
import gtk

def toggle(widget):
	widget.toggled()
	
def on_popup_menu(icn, button, time): 
	menu = gtk.Menu()
	item_close = gtk.MenuItem("Beenden")
	item_dialog = gtk.MenuItem("Nachfrage")
	item_close.connect("activate", gtk.main_quit)
	menu.append(item_dialog)
	menu.append(item_close)
	item_close.show()
	item_dialog.show()

	#Submenu
	submenu = gtk.Menu()
	item_dialog.set_submenu(submenu)
	item_sub_request_on = gtk.CheckMenuItem("Aktiviert")
	item_sub_request_off = gtk.CheckMenuItem("Deaktiviert")
	item_sub_request_on.connect("toggled", toggle)
	item_sub_request_off.connect("toggled", toggle)
	submenu.append(item_sub_request_on)
	submenu.append(item_sub_request_off)
	item_sub_request_on.show()
	item_sub_request_off.show()
		
	menu.popup(None, None, None, button, time) 
	
icn = gtk.StatusIcon()
icn.set_from_stock(gtk.STOCK_CANCEL)
icn.set_visible(True)
icn.connect("popup-menu", on_popup_menu)

gtk.main()
Ausgabe (nachdem ein Checkbutton angegklickt wird):
$ python test_check.py
Error in sys.excepthook:
RuntimeError: maximum recursion depth exceeded

Original exception was:
RuntimeError: maximum recursion depth exceeded
mfG, Knilch

Verfasst: Sonntag 11. Mai 2008, 16:43
von fred.reichbier
Signal 'toggled':
The "toggled" signal is emitted when the checkmenuitem changes state.
Methode 'toggled()':
The toggle() method emits the "toggled" signal on the checkmenuitem
Kommst du drauf? ;)

Was willst du eigentlich mit dem Signalhandler toggle() anstellen?

Verfasst: Sonntag 11. Mai 2008, 17:13
von Knilch
fred.reichbier hat geschrieben:Signal 'toggled':
The "toggled" signal is emitted when the checkmenuitem changes state.
Methode 'toggled()':
The toggle() method emits the "toggled" signal on the checkmenuitem
Kommst du drauf? ;)
Irgendwie nicht :?.
fred.reichbier hat geschrieben:Was willst du eigentlich mit dem Signalhandler toggle() anstellen?
Das Ganze sollte im Prinzip nur ein Test unabhaengig vom eigentlichen Programm sein. Eigentlich geht es darum, dass man den Aufruf eines Dialog de/aktivieren kann. Durch den Signalhandler toggle() versprach ich mir eigentlich, dass die jeweilige Box "gecheckt" wird, allerdings habe ich da wohl maechtig was falsch verstanden :?.

mfG, Knilch

Verfasst: Sonntag 11. Mai 2008, 18:13
von Trundle
Das mit dem "togglen" macht Gtk von alleine für dich, du darfst lediglich nicht immer ein neues Menü erstellen, sondern musst _einmal_ ein Menü erstellen und das immer wieder verwenden (also irgendwo eine Referenz darauf speichern und die benutzen).

Verfasst: Sonntag 11. Mai 2008, 18:19
von Knilch
Trundle hat geschrieben:Das mit dem "togglen" macht Gtk von alleine für dich, du darfst lediglich nicht immer ein neues Menü erstellen, sondern musst _einmal_ ein Menü erstellen und das immer wieder verwenden (also irgendwo eine Referenz darauf speichern und die benutzen).
Argh, ja natuerlich. Ich hatte nicht darauf geachtet, dass das Menue staendig neu definiert wird wenn man es aufrufen will... Danke :)

Verfasst: Sonntag 11. Mai 2008, 18:35
von fred.reichbier
Zur Ergänzung: du hast in deinem Signalhandler jeweils wieder indirekt den Signalhandler aufgerufen, dann meckert Python natürlich irgendwann ;)

Verfasst: Sonntag 11. Mai 2008, 18:48
von Knilch
fred.reichbier hat geschrieben:Zur Ergänzung: du hast in deinem Signalhandler jeweils wieder indirekt den Signalhandler aufgerufen, dann meckert Python natürlich irgendwann ;)
Oh, stimmt. Dadurch, dass die Boxes nicht "gecheckt" worden sind kam ich erst mal durcheinander und hatte dann das Problem an einer ganz falschen Stelle angepackt. Naja, vielen Dank nochmal :)

Allerdings habe ich nun noch eine Frage: z.B. Buttons kann man ja mit sozusagen vorgerfertigten Designs, also Stock-Buttons, versehen. Nun wird das z.B. in Gajim auch mit MenuItems gemacht, wie hier zu sehen.

In der Documentation kann ich dazu nichts finden; Ist das denn in Python ueberhaupt moeglich? Weil das ganze Tray-Gedoehns von Gajim ist soweit ich weis in C geschrieben.

mfG, Knilch

Verfasst: Sonntag 11. Mai 2008, 18:56
von Trundle
Das ist ein ``gtk.ImageMenuItem``.

Verfasst: Sonntag 11. Mai 2008, 19:23
von Leonidas
Knilch hat geschrieben:In der Documentation kann ich dazu nichts finden; Ist das denn in Python ueberhaupt moeglich? Weil das ganze Tray-Gedoehns von Gajim ist soweit ich weis in C geschrieben.
Nein. Gajims Tray hat zwei mögliche Backends: deren eigenes (das müsste wohl auf PyGTK aufsetzen) und gnome-python(-extras, weiß ich jetzt nicht mehr so genau).