2013年4月

这个程序就是使用lunar-calendar控件,然后显示出农历来。

先用glade-2画出一个日历窗口,设置窗口的销毁事件为调用gtk_main_quit函数,设置一下窗口图标,然后生成代码

设计后的glade-2的界面代码

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">

<glade-interface>

<widgetclass="GtkWindow"id="lunarcalendar">
  <propertyname="visible">True</property>
  <propertyname="title"translatable="yes">Lunar Calendar</property>
  <propertyname="type">GTK_WINDOW_TOPLEVEL</property>
  <propertyname="window_position">GTK_WIN_POS_NONE</property>
  <propertyname="modal">False</property>
  <propertyname="resizable">True</property>
  <propertyname="destroy_with_parent">False</property>
  <propertyname="icon">lunarcalendar.png</property>
  <propertyname="decorated">True</property>
  <propertyname="skip_taskbar_hint">False</property>
  <propertyname="skip_pager_hint">False</property>
  <propertyname="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
  <propertyname="gravity">GDK_GRAVITY_NORTH_WEST</property>
  <propertyname="focus_on_map">True</property>
  <propertyname="urgency_hint">False</property>
  <signalname="destroy"handler="gtk_main_quit"last_modification_time="Sat, 20 Apr 2013 11:12:31 GMT"/>

  <child>
    <widgetclass="GtkCalendar"id="calendar1">
      <propertyname="visible">True</property>
      <propertyname="can_focus">True</property>
      <propertyname="display_options">GTK_CALENDAR_SHOW_HEADING|GTK_CALENDAR_SHOW_DAY_NAMES|GTK_CALENDAR_NO_MONTH_CHANGE|GTK_CALENDAR_SHOW_WEEK_NUMBERS|GTK_CALENDAR_SHOW_DETAILS</property>
    </widget>
  </child>
</widget>

</glade-interface>

生成的源代码文件有:

src/callbacks.c
callbacks.h
interface.c
interface.h
src/main.c
src/Makefile.am
support.c
support.h

support.c/.h文件中就是一些支撑函数,一般不用管

我们需要关注就是interface.c/.h,这个文件就是创建控件的函数。

按照lunar-calendar说明,将interface.c中调用gtk_calendar_new替换成lunar_calendar_new,同时增加lunar-calendar/lunar-calendar.h的包含

修改完后的源代码如下:

生成并修改后的interface.c文件

/** DO NOT EDIT THIS FILE - it is generated by Glade.*/#ifdef HAVE_CONFIG_H
# include
<config.h> #endif#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>#include<string.h>#include<stdio.h>#include<gdk/gdkkeysyms.h>#include<gtk/gtk.h>#include<lunar-calendar/lunar-calendar.h>#include"callbacks.h"#include"interface.h"#include"support.h" #define GLADE_HOOKUP_OBJECT(component,widget,name) \g_object_set_data_full (G_OBJECT (component), name, \
gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \g_object_set_data (G_OBJECT (component), name, widget)

GtkWidget
*create_lunarcalendar (void)
{
GtkWidget
*lunarcalendar;
GdkPixbuf
*lunarcalendar_icon_pixbuf;
GtkWidget
*calendar1;

lunarcalendar
=gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_name (lunarcalendar,
"lunarcalendar");
gtk_window_set_title (GTK_WINDOW (lunarcalendar), _(
"Lunar Calendar"));
lunarcalendar_icon_pixbuf
= create_pixbuf ("lunarcalendar.png");if(lunarcalendar_icon_pixbuf)
{
gtk_window_set_icon (GTK_WINDOW (lunarcalendar), lunarcalendar_icon_pixbuf);
gdk_pixbuf_unref (lunarcalendar_icon_pixbuf);
}

calendar1
=lunar_calendar_new ();
gtk_widget_set_name (calendar1,
"calendar1");
gtk_widget_show (calendar1);
gtk_container_add (GTK_CONTAINER (lunarcalendar), calendar1);
gtk_calendar_display_options (GTK_CALENDAR (calendar1),
GTK_CALENDAR_SHOW_HEADING
|GTK_CALENDAR_SHOW_DAY_NAMES|GTK_CALENDAR_NO_MONTH_CHANGE|GTK_CALENDAR_SHOW_WEEK_NUMBERS);

g_signal_connect ((gpointer) lunarcalendar,
"destroy",
G_CALLBACK (gtk_main_quit),
NULL);
/*Store pointers to all widgets, for use by lookup_widget().*/GLADE_HOOKUP_OBJECT_NO_REF (lunarcalendar, lunarcalendar,"lunarcalendar");
GLADE_HOOKUP_OBJECT (lunarcalendar, calendar1,
"calendar1");returnlunarcalendar;
}

到此,我们完成了第一步,生成代码

代码压缩为:lunarcalendar.0.0.1.zip

#coding=utf-8
from django importtemplate

register
=template.Library()#register.tag('source', do_source) @register.tag(name="source")defdo_source(parser, token):"""source can direct insert method return string into html
{% source myapp mymethod %}
or
{% source myapp mymethod arg0 arg1 arg2 %}
or
{% source myapp mymethod arg0,arg1,arg2 %}
""" try:#split_contents() knows not to split quoted strings. args =token.split_contents()exceptValueError:raise template.TemplateSyntaxError("%r tag requires at least two arguments" %token.contents.split()[0])if len(args) < 2:raise template.TemplateSyntaxError("%r tag requires at least two arguments" %token.contents.split()[0])
model_name
= args[1]
method_name
= args[2]
params
=[]if len(args) >=3:
params
+= args[3:]if len(params) == 1:if ',' inparams[0]:
params
= ['%s' % arg for arg in params[0].split(",")]#try to import this method try:
models
= __import__(model_name, fromlist =[method_name])
method
=getattr(models, method_name)except:raise template.TemplateSyntaxError("Can't import %s[%s]" %(model_name, method_name))returnSourceNode(method, params)classSourceNode(template.Node):def __init__(self, method, params):
self.method
=method
self.params
=paramsdefrender(self, context):try:
value
= self.method(context, (arg for arg inself.params))except:from django.conf importsettingsifsettings.DEBUG:importsys,traceback
str
= '<p> [%s] [%s] </p>' %(self.method, self.params)
str
+= '<p> [%s] </p>' % traceback.format_exception(*sys.exc_info())returnstrelse:returnstrreturn value