gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:13:23 24 4
gpt4 key购买 nike

我希望能够从组合框中的日历中选择日期。
这里给出的答案Showing a gtk.Calendar in a menu?并不满足我,因为使用自定义单元格渲染器似乎可以做得更好,如下所示: http://faq.pygtk.org/index.py?req=show&file=faq13.056.htp但我无法正确使用渲染器。

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

我是否必须将组合框信号连接到 CellRendererDate 类中的 do_start_editing 函数? (然后如何?)或者缺少什么?

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

最佳答案

关于python - 在组合框下拉菜单中显示日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com