Googleフォームのようなモダンなデザインの研究用アンケートアプリケーションです。 customtkinterを使用して実装されています。
- GUIで問題作成: 直感的なインターフェースで質問と選択肢を作成
- 問題の順番変更: 問題を自由に並べ替え・削除可能
- CSV/JSON入出力: 質問データをCSVファイルとして保存・読み込み、回答データはCSV/JSON両方に対応
- 自動ファイル読み込み: 設定したディレクトリから問題ファイルを自動読み込み
- 自由記述機能: 選択した理由を記述できる
- 選択肢変更ルール: 理由を書き始めたら、完了するまで選択肢を変更できない
- タイムスタンプログ: すべてのボタン操作をログに記録
- 設定機能: ログや回答ファイルの出力先、ファイル名を自動設定
- 外観カスタマイズ: ライト/ダークモード、カラーテーマ、フォントサイズの変更可能
初回起動時に自動的にデフォルトディレクトリが作成されますが、手動で実行することも可能です:
python setup.pyこれにより以下が作成されます:
data/questions/: 問題ファイル保存用ディレクトリdata/responses/: 回答ファイル保存用ディレクトリdata/logs/: ログファイル保存用ディレクトリdata/questions/sample_questions.csv: サンプル問題ファイル
python survey_app.py- メイン画面で「⚙ 設定」ボタンをクリック
- 以下の項目を設定:
- 問題ファイルのディレクトリ: 問題CSVファイルが保存されているディレクトリ
- 問題ファイル名: 使用する問題ファイルの名前(例: questions.csv)
- ログ出力ディレクトリ: アクションログの保存先
- ログファイル名フォーマット: ログファイルの命名規則
- 回答出力ディレクトリ: 回答CSVの保存先
- 回答ファイル名フォーマット: 回答ファイルの命名規則
- 「保存」をクリック
ファイル名フォーマットで使用可能な変数:
{date}: 日付(YYYYMMDD形式){time}: 時刻(HHMMSS形式){respondent_id}: 回答者ID{sequence}: 連番(既存ファイルから自動で次の番号を取得)
アプリケーション設定:
- 外観モード: System(システム設定に従う)/ Light(ライト)/ Dark(ダーク)
- カラーテーマ: blue(青)/ green(緑)/ dark-blue(濃い青)
- 出力形式: csv(CSV形式)/ json(JSON形式)/ both(両方)
- フォントサイズ: small(小)/ medium(中)/ large(大)
- 自動保存: 有効にすると設定に基づいて自動保存、無効にすると毎回保存先を選択
- メイン画面で「問題を作成」ボタンをクリック
- 質問文を入力
- 選択肢を入力(最低2つ必要)
- 「問題を追加」ボタンで問題リストに追加
- 問題リストで問題を選択して:
- 「↑ 上へ」「↓ 下へ」ボタンで順番を変更
- 「✕ 削除」ボタンで削除
- すべての問題を作成したら「保存」で保存
- CSV形式またはJSON形式を選択可能
- メイン画面で「アンケートに回答」ボタンをクリック
- 設定で問題ファイルを指定している場合は自動的に読み込まれます
- 設定していない場合は手動でCSVまたはJSONファイルを選択
- 各質問について:
- 選択肢を選択(選択した選択肢は緑色になります)
- 選択した理由を記入
- 「理由の記入を完了」ボタンをクリック
- 必要に応じて選択肢を変更可能(理由は再入力が必要)
- 「次の問題へ」で次へ進む
- すべての問題に回答したら、設定に応じて自動的に保存されます
- 選択肢を選んだ後、いつでも選び直すことができます
- 理由を書き始めた後は、「理由の記入を完了」ボタンを押すまで選択肢を変更できません
- 理由の記入を完了すれば、再び選択肢を変更できるようになります
- 選択肢を変更した場合は、理由を再度記入する必要があります
study_form_app/
├── survey_app.py # メインアプリケーション
├── question_editor.py # 問題作成エディタ
├── survey_interface.py # アンケート回答画面
├── settings_window.py # 設定画面
├── config_manager.py # 設定管理
├── utils.py # CSV/JSON入出力ユーティリティ
├── logger.py # タイムスタンプログ機能
├── constants.py # 定数定義(保守性向上)
├── setup.py # 初期セットアップスクリプト
├── config.json # 設定ファイル(自動生成)
├── data/ # データディレクトリ(自動生成)
│ ├── questions/ # 問題ファイル保存先
│ │ └── sample_questions.csv # サンプル問題
│ ├── responses/ # 回答ファイル保存先
│ ├── logs/ # ログファイル保存先
│ └── README.txt # データディレクトリの説明
└── README.md # このファイル
問題ファイルはCSV形式とJSON形式の両方に対応しています。
CSV形式:
問題番号,質問文,選択肢1,選択肢2,選択肢3,選択肢4,選択肢5
1,質問文の例,選択肢A,選択肢B,選択肢C,,
JSON形式:
{
"questions": [
{
"text": "質問文の例",
"choices": ["選択肢A", "選択肢B", "選択肢C"]
}
],
"total_questions": 1,
"created_date": "2025-01-15 10:30:00.000"
}設定した出力形式に応じてCSV、JSON、または両方で保存されます。
CSV形式:
回答者ID,タイムスタンプ,問題番号,質問文,選択した回答,理由
12345678,2025-01-15 10:30:45.123,1,質問文の例,選択肢A,選択した理由...
JSON形式:
{
"responses": [
{
"respondent_id": "12345678",
"timestamp": "2025-01-15 10:30:45.123",
"question_num": 1,
"question_text": "質問文の例",
"selected_choice": "選択肢A",
"reason": "選択した理由..."
}
],
"export_date": "2025-01-15 10:35:00.000",
"total_responses": 1
}設定で指定したディレクトリに保存されます。ファイル名は設定したフォーマットに従います。
タイムスタンプ,アクション種別,詳細情報
2025-01-15 10:30:45.123,選択肢選択,問題1: 選択肢A
2025-01-15 10:30:50.456,理由入力開始,問題1
2025-01-15 10:31:20.789,理由入力完了,問題1
連番機能の例:
ファイル名フォーマットを responses_{sequence}.csv に設定した場合:
- 最初の保存:
responses_001.csv - 2回目の保存:
responses_002.csv - 3回目の保存:
responses_003.csv
複数の変数を組み合わせることも可能です。例: log_{date}_{sequence}.csv
- 2025年1月15日の1回目:
log_20250115_001.csv - 2025年1月15日の2回目:
log_20250115_002.csv
アプリケーションの設定を保存します。初回起動時に自動生成されます。
{
"questions_directory": "/path/to/questions",
"questions_file": "questions.csv",
"log_directory": "/path/to/logs",
"log_name_format": "action_log_{date}.csv",
"response_directory": "/path/to/responses",
"response_name_format": "responses_{respondent_id}_{date}.csv",
"appearance_mode": "System",
"color_theme": "blue",
"output_format": "csv",
"font_size": "medium",
"auto_save": true
}- Python 3.7以上
- customtkinter
pip install customtkinter本アプリケーションは保守性を重視して設計されています:
定数管理 (constants.py)
- すべてのマジックナンバー、UI設定、メッセージを一元管理
- 色、フォントサイズ、ウィンドウサイズなどを簡単に変更可能
- ログメッセージも定数化され、一貫性を確保
モジュール構造
- 各ファイルは単一責任の原則に従って設計
- ヘルパーメソッド(
_update_choice_button_colorsなど)で重複コードを削減 - クラスベースの設計で拡張性を確保
デフォルト設定
- 設定ファイル(
config.json)でカスタマイズ可能 - デフォルト値は
constants.pyのDEFAULT_CONFIGで管理 - デフォルトディレクトリ構造を自動生成
リファクタリングのポイント
- ハードコードされた文字列を定数に置き換え
- 繰り返しコードをヘルパーメソッドに抽出
- 設定値を外部ファイル化
- UI設定の変更:
constants.pyのFONT_SIZE_*、COLOR_*を編集 - デフォルト設定の変更:
constants.pyのDEFAULT_CONFIGを編集 - ログ動作の変更:
constants.pyのLOG_ACTIONS、LOG_TEXT_PREVIEW_LENGTHを編集
研究用途で自由にご使用ください。