[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題30] カレンダー ]

[課題30] カレンダー

課題

GUIを備えたカレンダープログラムを作成してください. プログラムは祝日の名前を表示する機能を持っているとします. また余裕があれば,スケジュールを表示・記録するように拡張してください. 作成したプログラムを提出してください.

作成するプログラムは次のようなインタフェイスを備えているものとします.

作成するプログラムでは,カレンダー表示欄で選択された日が 祝日であるときには「情報表示欄」にその祝日の名称を表示して, 祝日でないときには何も表示しないことにします.

祝日として,日本の祝日を扱う必要はありません. 架空の祝日を設定して構いません. 祝日は毎年固定であるとして,成人の日,春分の日などのように 年によって移動しうる祝日に対応する必要はありません. 要するにプログラム内で記述した(適当な)祝日のデータに従って, カレンダーで情報が表示できればよいことにします.

[option] スケジュール機能について

スケジュール機能をもたせる場合には,情報表示欄を入力欄としても利用します. 入力するスケジュールは日付ごとに1行のみとします. 日付を指定して,スケジュールを入力すると, その日が選択されるたびに,当該のスケジュールを表示することにします.

さらにスケジュールデータを(適当な名前の)ファイルに保存して, プログラムが実行開始されたときに,そのファイルに保存されている スケジュールをすべて読み込むこと,また プログラム終了時には,保持されているスケジュールデータを すべてファイルに保存することができるとよいでしょう.

スケジュール機能を実現する場合,祝日の名称表示は実現しなくても構いません. できるなら両方を(一つのプログラムとして)実現してみてください. その場合,祝日にスケジュールが登録されていたら,「祝日の名称」に続いて,スケジュールを表示することにします.

もくじ

  1. プログラムヘッダ(GUIライブラリの読み込み)
  2. ウィジェットによるGUIの構築
  3. GUIプログラムの基本構成
  4. さまざまなウィジェットとメソッド(コールバックを含む)
  5. ウインドウの表示とイベントループ開始
  6. サンプルプログラム
  7. 参考情報

次に示すコードをプログラムの先頭にコピーして入れておくようにしてください(必要事項は記入してください).


=begin

所属:     
氏名:     
学生番号:
難易度(5段階評価): 

感想など(任意)

=end

# Gtk2(GUIライブラリ)を読み込む
require 'gtk2'

ここでrequireしているGtk2は代表的なGUIライブラリの一つです. タートルグラフィクスもGtk2を使って作成しています.

ウィジェットによるGUIの構築

widgetによるGUIの構成例

GUIはウィジェット(Widget)を組み合わせて構築します. 基本要素として次のようなものがあります.

GUIプログラムの基本構成

ここではGUIプログラムの基本構成を説明します. まず次にサンプルプログラム(hello.rb)を示します.


  require 'gtk2' # Gtk2 GUIライブラリ

  # トップレベルウインドウ
  window = Gtk::Window.new('Hello!') # 引数はウインドウのタイトル
  window.signal_connect('destroy') { Gtk.main_quit } # 終了処理
  window.signal_connect('delete_event') { false }    # タイトルバーの[×]ボタンの処理

  # 縦方向パッキングボックス
  vbox = Gtk::VBox.new      
  vbox.set_border_width(10) # vboxの周囲のスペースの広さ
  vbox.set_spacing(10)      # vboxの要素の間のスペースの幅

  # メッセージ表示ラベル
  msg = Gtk::Label.new(' Hello, world! ')

  # [Quit]ボタン(押されたら終了)
  qbutton = Gtk::Button.new(Gtk::Stock::QUIT)          # Stockを貼り付けたボタン
  # ボタンがクリックされたときのコールバック
  qbutton.signal_connect('clicked') do
    window.destroy # トップレベルウインドウを閉じて終了する
  end

  # レイアウト
  vbox.pack_start(msg)      # msgをボックスの先頭から入れる
  vbox.pack_start(qbutton)  # qbuttonをボックスの先頭から入れる
  window.add(vbox)          # vboxをwindowに入れる

  # 実行開始
  window.show_all # ウインドウの表示
  Gtk.main        # イベントループ

プログラムは3つに分けることができます.

  1. 各ウィジェットの定義(コールバックの定義も含む)
  2. レイアウト(ウィジェットの配置)
  3. 実行開始(ウィジェット表示とイベントループの開始)

最初にトップレベルウィンドウ,コンテナをはじめとする各種のウィジェットを一通り定義します. このときプログラムで処理するイベントに対応するコールバックも定義します. 次に各ウィジェットをコンテナウィジェットを組み合わせて配置します. ここまでで準備は終了です. 最後にウィジェットを表示してイベントループを開始します. これによりGUIが表示され,イベント処理が開始されます.

なおこのプログラムのGUIは次のようなウイジェットで構成されています.


  window(トップレベル) -- vbox(コンテナ) --+-- msg(ラベル)
                                           |
                                           +-- qbutton(ボタン)

さまざまなウィジェットとメソッド(コールバックを含む)

ここでは課題のプログラムで利用する可能性のある各種ウィジェット, 設定のためのメソッド(コールバック)を示します. コールバックは処理するイベントごとに定義します.

ウインドウの表示とイベントループ開始

ウィジェットとコールバックを定義して,ウィジェットを配置して,GUIのすべての準備が終了したら,最後に次の処理によってウインドウを表示して,イベントループを開始します.


  # 実行開始
  window.show_all # ウインドウ表示(トップレベルウインドウに対して適用する)
  Gtk.main        # イベントループ開始

サンプルプログラム

サンプルプログラムを用意しています. プログラムをブラウザの画面で開いたときに文字化けしてしまう場合には, ダウンロードしてEmacs等で開いてみてください.

[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題30] カレンダー ]