Pygtk 简明教程

PyGTK - Calendar Class

PyGTK 工具包中的日历小组件一次显示一个月视图的简单日历。默认情况下显示更改月份和年份的导航控件。可以适当地配置显示选项。

月份属性的值介于 0 到 11 之间,日期属性的值介于 1 到 31 之间。

有一个简单的构造函数来创建 gtk.Calendar 对象 -

cal = gtk.Calendar()

默认显示样式显示当前月份和年份以及日期名称。

gtk.Calendar 类有以下方法 -

  1. Calendar.select_month(mm,yy) — 此操作将更改日历显示为指定的 mmyy

  2. Calendar.select_day(dd) — 当日历的值介于 1 到 31 之间时,此操作选择日历上的指定 dd 。如果 dd 为 0,则会删除当前日期选择。

  3. Calendar.display_options() — 这会将日历显示选项设置为 flags 指定的值。可能的显示选项组合包括:

gtk.CALENDAR_SHOW_HEADING

指定显示月份和年份。

gtk.CALENDAR_SHOW_DAY_NAMES

指定显示三字母星期描述。

gtk.CALENDAR_NO_MONTH_CHANGE

防止用户使用日历切换月份。

gtk.CALENDAR_SHOW_WEEK_NUMBERS

在日历左侧向下显示当前年份的各周数。

gtk.CALENDAR_WEEK_START_MONDAY

将日历星期从默认的星期日改为星期一。

  1. Calendar.get_date() — 这会将日历的当前年、月和选定星期数作为一个元组 (年、月、日) 提取出来。

gtk.Calendar 窗口小部件发出以下信号 −

day-selected

当某一天通过用户或程序选择后发出此信号。

month-changed

当用户或程序更换日历月份时,发出此信号。

next-month

当用户单击日历标题中的“下一个月”导航控件时发出此信号。

next-year

当用户单击日历标题中的“下一年”导航控件时发出此信号。

prev-month

当用户单击日历标题中的“上一个月”导航控件时发出此信号。

prev-year

当用户单击日历标题中的“上一年”导航控件时发出此信号。

在以下示例中,一个 gtk.Calendar 控件和四个按钮被放置在顶级窗口中。

当单击“标题”按钮时,日历的显示选项被设置为 SHOW_HEADING −

def heading(self, widget):
   self.cal.set_display_options(gtk.CALENDAR_SHOW_HEADING)

当用户单击“星期名称”按钮时,回调会将显示选项设置为 SHOW_DAY_NAMES −

def dayname(self, widget):
self.cal.set_display_options(gtk.CALENDAR_SHOW_DAY_NAMES)

当按下“两者”按钮时,会启用两者显示选项。一开始,所有显示选项的标志都会通过将其设置为 0 而移除。

self.cal.set_display_options(0)

“设置”按钮弹出的消息框显示当前标记的日期。

tp = self.cal.get_date()
str1 = str(tp[0])
str2 = str(tp[1]+1)
str3 = str(tp[2])
label = gtk.Label("Date selected:"+str3+"-"+str2+"-"+str1)
dialog.vbox.add(label)
label.show()

Example

观察以下代码 -

import gtk

class PyApp(gtk.Window):

   def __init__(self):
      super(PyApp, self).__init__()
      self.set_title("Calendar Demo")
      self.set_size_request(300, 200)
      self.set_position(gtk.WIN_POS_CENTER)

      vbox = gtk.VBox(False, 5)
      self.cal = gtk.Calendar()
      halign1 = gtk.Alignment(0.5, 0.5, 0, 0)
      halign1.add(self.cal)

      self.cal.set_display_options(0)
      valign = gtk.Alignment(0, 1, 0, 0)
      vbox.pack_start(halign1)

      self.btn1 = gtk.Button("set")
      self.btn2 = gtk.Button("heading")
      self.btn3 = gtk.Button("day name")
      self.btn4 = gtk.Button("Both")

      hbox = gtk.HBox(True, 3)
      hbox.add(self.btn1)
      hbox.add(self.btn2)
      hbox.add(self.btn3)
      hbox.add(self.btn4)

      halign = gtk.Alignment(0.5, 0.5, 0, 0)
      halign.add(hbox)

      vbox.pack_start(halign, False, True, 10)
      self.add(vbox)

      self.btn1.connect("clicked", self.selectdate)
      self.btn2.connect("clicked", self.heading)
      self.btn3.connect("clicked", self.dayname)
      self.btn4.connect("clicked", self.bothflags)

      self.connect("destroy", gtk.main_quit)
      self.show_all()

   def heading(self, widget):
      self.cal.set_display_options(gtk.CALENDAR_SHOW_HEADING)

   def dayname(self, widget):
      self.cal.set_display_options(gtk.CALENDAR_SHOW_DAY_NAMES)

   def bothflags(self, widget):
      self.cal.set_display_options(gtk.CALENDAR_SHOW_HEADING|gtk.CALENDAR_SHOW_DAY_NAMES)
   def selectdate(self, widget):
      tp = self.cal.get_date()
      dialog = gtk.Dialog("My dialog",
      self,
      gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
      (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))

      str1 = str(tp[0])
      str2 = str(tp[1]+1)
      str3 = str(tp[2])

      label = gtk.Label("Date selected:"+str3+"-"+str2+"-"+str1)
      dialog.vbox.add(label)
      label.show()
      res = dialog.run()
      dialog.destroy()

PyApp()
gtk.main()

上述代码将生成以下输出 −

calendar demo