¿Mostrando un gtk.Calendar en un menú?
Quiero construir un menú contextual con un elemento de menú para seleccionar una fecha. (El caso de uso es seleccionar un grupo de elementos en una vista de árbol y luego establecer una nueva fecha de vencimiento para todos los artículos.)
Como un elemento de menú es un Gtk.Bin, puedo especificar cualquier widget en lugar de una etiqueta. Sin embargo, no puedo interactuar con el widget. Si hago clic en cualquier parte del menú, el elemento de menú recibe el clic. Entonces, no puedo seleccionar una fecha en particular, ni navegar meses o años. ¿Cómo puedo hacer que el calendario obtenga la actividad del mouse?
Además, hay un relleno externo alrededor del exterior del calendario, y cuando se coloca sobre él se vuelve naranja. ¿Cómo puedo eliminar el relleno y/o no resaltar el color naranja?
#!/usr/bin/env python
import gobject
import pygtk
pygtk.require('2.0')
import gtk
import time
class ContextMenu(gtk.Menu):
def __init__(self):
gtk.Menu.__init__(self)
def add_calendar_submenu_item(self, text, callback, uuids, data=None):
calendar = gtk.Calendar()
calendar.show()
calendar_item = gtk.MenuItem()
calendar_item.add(calendar)
calendar_item.show()
submenu = gtk.Menu()
submenu.append(calendar_item)
submenu_item = gtk.MenuItem("%s..." %(text))
submenu_item.set_submenu(submenu)
submenu_item.show()
submenu_item.connect("activate", self.on_calendar_activate)
self.append(submenu_item)
def on_calendar_activate(self, widget):
print "activate"
if __name__ == "__main__":
class CalendarExample:
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Calendar Example")
window.set_border_width(5)
window.set_size_request(200, 100)
window.set_resizable(False)
window.stick()
window.connect("destroy", lambda x: gtk.main_quit())
menu = ContextMenu()
menu.add_calendar_submenu_item("date", self.on_date, ['123'])
root_menu = gtk.MenuItem("Calendar Menu")
root_menu.show()
root_menu.set_submenu(menu)
vbox = gtk.VBox(False, 10)
window.add(vbox)
vbox.show()
menu_bar = gtk.MenuBar()
vbox.pack_start(menu_bar, False, False, 2)
menu_bar.append (root_menu)
menu_bar.show()
button = gtk.Button("Push Me")
button.connect("clicked", self.on_menu_push, menu)
vbox.pack_start(button, False, True, 10)
button.show()
window.show()
def on_menu_push(self, widget, menu):
menu.popup(None, None, None, 0, 0)
def on_action(self, widget, uuids, text):
print "Item %s pressed" %(text)
def on_date(self, widget, uuids, text):
print "Calendar activated with %s" %(text)
CalendarExample()
gtk.main()
[Actualización]
Lo que voy a es algo parecido al indicador de fecha menú de Ubuntu/calendario de tiempo.
Eso es feo, ya que no hay más elementos de menú, ¿por qué acaba de poner el calendario dentro de una ventana emergente? – saeedgnu
También puede poner muchos botones o incluso una barra de herramientas en esa ventana emergente (si desea tener más acciones en la ventana emergente) – saeedgnu
Intenté primero un acercamiento de ventana emergente, pero al colocar el menú emergente en la posición correcta parecía que sería demasiado complicado , especialmente teniendo en cuenta que las dimensiones del menú pueden variar según el idioma del usuario y las preferencias de fuente, etc. Lo mantendré como una opción alternativa si no se puede hacer que lo anterior funcione. – bryce