python日历下拉框_在组合下拉菜单中显示日历

下面的代码向您展示了我所拥有的,但它只是提供了一个没有任何内容的组合框,也没有下拉菜单。在

我是否必须从CellRendererDate类将combobox信号连接到Do\u start_编辑函数?(然后怎么做?)或是缺少什么?在class MyWindow(gtk.Window):

....

liststore=gtk.ListStore(str)

cell=CellRendererDate()

cell.set_property('editable',True)

combo=gtk.ComboBox(liststore)

combo.pack_start(cell, True)

combo.add_attribute(cell, 'text', 0)

....

class CellRendererDate(gtk.CellRendererText): # code from the pygtk FAQ, linked above

__gtype_name__ = 'CellRendererDate'

def __init__(self):

gtk.CellRendererText.__init__(self)

self.date_format = '%d/%m/%Y'

self.calendar_window = None

self.calendar = None

def _create_calendar(self, treeview):

self.calendar_window = gtk.Dialog(parent=treeview.get_toplevel())

self.calendar_window.action_area.hide()

self.calendar_window.set_decorated(False)

self.calendar_window.set_property('skip-taskbar-hint', True)

self.calendar = gtk.Calendar()

self.calendar.display_options(gtk.CALENDAR_SHOW_DAY_NAMES | gtk.CALENDAR_SHOW_HEADING)

self.calendar.connect('day-selected-double-click', self._day_selected, None)

self.calendar.connect('key-press-event', self._day_selected)

self.calendar.connect('focus-out-event', self._selection_cancelled)

self.calendar_window.set_transient_for(None) # cancel the modality of dialog

self.calendar_window.vbox.pack_start(self.calendar)

# necessary for getting the (width, height) of calendar_window

self.calendar.show()

self.calendar_window.realize()

def do_start_editing(self, event, treeview, path, background_area, cell_area, flags):

if not self.get_property('editable'):

return

if not self.calendar_window:

self._create_calendar(treeview)

# select cell's previously stored date if any exists - or today

if self.get_property('text'):

date = datetime.datetime.strptime(self.get_property('text'), self.date_format)

else:

date = datetime.datetime.today()

self.calendar.freeze() # prevent flicker

(year, month, day) = (date.year, date.month - 1, date.day) # datetime's month starts from one

self.calendar.select_month(int(month), int(year))

self.calendar.select_day(int(day))

self.calendar.thaw()

# position the popup below the edited cell (and try hard to keep the popup within the toplevel window)

(tree_x, tree_y) = treeview.get_bin_window().get_origin()

(tree_w, tree_h) = treeview.window.get_geometry()[2:4]

(calendar_w, calendar_h) = self.calendar_window.window.get_geometry()[2:4]

x = tree_x + min(cell_area.x, tree_w - calendar_w + treeview.get_visible_rect().x)

y = tree_y + min(cell_area.y, tree_h - calendar_h + treeview.get_visible_rect().y)

self.calendar_window.move(x, y)

response = self.calendar_window.run()

if response == gtk.RESPONSE_OK:

(year, month, day) = self.calendar.get_date()

date = datetime.date(year, month + 1, day).strftime (self.date_format) # gtk.Calendar's month starts from zero

self.emit('edited', path, date)

self.calendar_window.hide()

return None # don't return any editable, our gtk.Dialog did the work already

def _day_selected(self, calendar, event):

# event == None for day selected via doubleclick

if not event or event.type == gtk.gdk.KEY_PRESS and gtk.gdk.keyval_name(event.keyval) == 'Return':

self.calendar_window.response(gtk.RESPONSE_OK)

return True

def _selection_cancelled(self, calendar, event):

self.calendar_window.response(gtk.RESPONSE_CANCEL)

return True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值