日付を選択するためのメニュー項目を使用してコンテキストメニューを作成したいと思います。(ユースケースは、ツリービューで一連のアイテムを選択してから、すべてのアイテムに新しい期日を設定することです。)
menuitemはGtk.Binなので、ラベルの代わりに任意のウィジェットを指定できます。ただし、ウィジェットを操作できないようです。メニューのどこかをクリックすると、menuitemがクリックされます。そのため、特定の日付を選択したり、月や年をナビゲートしたりすることはできません。カレンダーにマウスアクティビティを取得するにはどうすればよいですか?
また、カレンダーの外側には余分なパディングがあり、カーソルを合わせるとオレンジ色に変わります。パディングを削除したり、オレンジ色のハイライトを行わないようにするにはどうすればよいですか?
#!/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()
[アップデート]
私が目指しているのは、Ubuntuのインジケーターメニューの日付/時刻カレンダーに似たものです。