Wyświetlanie gtk.Calendar w menu?
Chcę skonstruować menu kontekstowe z elementem menu do wyboru daty. (Przypadek użycia wybiera grupę elementów w widoku drzewa, a następnie ustawia nowy termin dla wszystkich elementów.)
Ponieważ menuitem to Gtk.Bin, mogę podać dowolny widżet zamiast etykiety. Jednak nie mogę wydawać się interakcji z widżetem. Jeśli kliknę w dowolnym miejscu menu, menuitem otrzyma kliknięcie. Nie mogę więc wybrać konkretnej daty ani nawigować przez miesiące ani lata. Jak sprawić, by kalendarz działał jak mysz?
Ponadto poza obrysem kalendarza znajduje się obcy materiał, który po obróceniu się zmienia kolor na pomarańczowy. Jak mogę usunąć wyściółkę i/lub nie zrobić pomarańczowego światła?
#!/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()
[Aktualizacja]
Co Idę jest coś podobnego do Ubuntu wskaźnik daty menu/kalendarz czasu.
To brzydkie, skoro nie ma już żadnych pozycji w menu, dlaczego właśnie umieszczasz kalendarz w wyskakującym okienku? – saeedgnu
Możesz również umieścić wiele przycisków lub nawet pasek narzędzi w tym wyskakującym okienku (jeśli chcesz mieć więcej akcji w wyskakującym okienku) – saeedgnu
Najpierw podjąłem próbę wyskakującego okienka, ale prawidłowe ustawienie menu wyskakującego wyglądało na zbyt trudne. , zwłaszcza biorąc pod uwagę, że wymiary menu mogą się różnić w zależności od preferencji językowych i czcionek użytkownika i tak dalej. Zachowuję to jako opcję awaryjną, jeśli powyższe nie może zostać wprowadzone do działania. – bryce