npyscreen

Pythonのncursesベースのアプリケーションフレームワーク。フォーム、ウィジェット、テーマシステムを提供し、複雑なTUIアプリケーションの構築をサポートします。

TUIncursesFormsWidgetsFramework

GitHub概要

npcole/npyscreen

Automatically exported from code.google.com/p/npyscreen

スター500
ウォッチ19
フォーク112
作成日:2015年5月5日
言語:Python
ライセンス:Other

トピックス

なし

スター履歴

npcole/npyscreen Star History
データ取得日時: 2025/7/25 06:23

npyscreen

npyscreenは、Pythonのncursesベースのアプリケーションフレームワークです。フォーム中心の設計思想により、複雑なTUIアプリケーションを効率的に構築できます。豊富なウィジェットとテーマシステムを提供し、特にデータ入力や設定画面の作成に優れています。

主な特徴

フォーム中心の設計

  • フォームベース: 画面をフォーム単位で管理
  • ウィジェット管理: フォーム内でのウィジェット配置
  • ナビゲーション: フォーム間の遷移システム

豊富なウィジェット

  • 入力ウィジェット: テキスト、数値、日付入力
  • 選択ウィジェット: リスト、チェックボックス、ラジオボタン
  • 表示ウィジェット: ラベル、テキストエリア、プログレスバー

テーマとカスタマイズ

  • 色テーマ: プリセットテーマとカスタムテーマ
  • ウィジェットスタイル: 外観のカスタマイズ
  • レイアウト制御: フレキシブルなレイアウト管理

インストール

pip install npyscreen

基本的な使用方法

シンプルなアプリケーション

import npyscreen

class TestApp(npyscreen.NPSApp):
    def main(self):
        # フォームの作成
        F = npyscreen.Form(name="Welcome to Npyscreen")
        
        # ウィジェットの追加
        t = F.add(npyscreen.TitleText, name="Text:")
        t.value = "Hello World!"
        
        # フォームの表示と編集
        F.edit()

if __name__ == '__main__':
    App = TestApp()
    App.run()

フォームクラスの使用

import npyscreen

class MainForm(npyscreen.Form):
    def create(self):
        # ウィジェットの作成
        self.name_field = self.add(npyscreen.TitleText, 
                                  name="Name:", 
                                  value="John Doe")
        
        self.email_field = self.add(npyscreen.TitleText,
                                   name="Email:",
                                   value="[email protected]")
        
        self.age_field = self.add(npyscreen.TitleSlider,
                                 name="Age:",
                                 out_of=100,
                                 value=25)
        
        self.gender_field = self.add(npyscreen.TitleSelectOne,
                                    name="Gender:",
                                    values=["Male", "Female", "Other"],
                                    value=0)

class TestApp(npyscreen.NPSApp):
    def main(self):
        F = MainForm(name="User Information")
        F.edit()
        
        # 入力値の取得
        print("Name:", F.name_field.value)
        print("Email:", F.email_field.value)
        print("Age:", F.age_field.value)
        print("Gender:", F.gender_field.get_selected_objects()[0])

if __name__ == '__main__':
    App = TestApp()
    App.run()

高度な機能

複数フォーム管理

import npyscreen

class MenuForm(npyscreen.ActionForm):
    def create(self):
        self.add(npyscreen.TitleText, name="Welcome!", editable=False)
        self.menu_list = self.add(npyscreen.TitleSelectOne,
                                 name="Select Option:",
                                 values=["User Form", "Settings", "Exit"])
    
    def on_ok(self):
        selected = self.menu_list.get_selected_objects()[0]
        if selected == "User Form":
            self.parentApp.switchForm("USER")
        elif selected == "Settings":
            self.parentApp.switchForm("SETTINGS")
        elif selected == "Exit":
            self.parentApp.switchForm(None)

class UserForm(npyscreen.ActionForm):
    def create(self):
        self.name = self.add(npyscreen.TitleText, name="Name:")
        self.email = self.add(npyscreen.TitleText, name="Email:")
    
    def on_ok(self):
        # データの保存処理
        npyscreen.notify_confirm(f"Saved: {self.name.value}")
        self.parentApp.switchForm("MAIN")
    
    def on_cancel(self):
        self.parentApp.switchForm("MAIN")

class SettingsForm(npyscreen.ActionForm):
    def create(self):
        self.theme = self.add(npyscreen.TitleSelectOne,
                             name="Theme:",
                             values=["Default", "Dark", "Light"])
        self.auto_save = self.add(npyscreen.RoundCheckBox,
                                 name="Auto Save")
    
    def on_ok(self):
        npyscreen.notify_confirm("Settings saved!")
        self.parentApp.switchForm("MAIN")
    
    def on_cancel(self):
        self.parentApp.switchForm("MAIN")

class MultiFormApp(npyscreen.NPSAppManaged):
    def onStart(self):
        self.addForm("MAIN", MenuForm, name="Main Menu")
        self.addForm("USER", UserForm, name="User Form")
        self.addForm("SETTINGS", SettingsForm, name="Settings")

if __name__ == '__main__':
    App = MultiFormApp()
    App.run()

データリストの表示

import npyscreen

class ListForm(npyscreen.Form):
    def create(self):
        # データリストの作成
        self.data_list = self.add(npyscreen.MultiLineEdit,
                                 name="Data List:",
                                 values=[
                                     "Item 1: Description of item 1",
                                     "Item 2: Description of item 2",
                                     "Item 3: Description of item 3",
                                     "Item 4: Description of item 4",
                                 ])
        
        # フィルター機能付きリスト
        self.filtered_list = self.add(npyscreen.TitleMultiLine,
                                     name="Filtered List:",
                                     values=["Apple", "Banana", "Cherry", "Date"])
        
        # 検索フィールド
        self.search_field = self.add(npyscreen.TitleText,
                                    name="Search:",
                                    value="")
        
        # 検索ボタンの代わりにリアルタイム検索
        self.search_field.when_value_edited = self.filter_list
    
    def filter_list(self):
        search_term = self.search_field.value.lower()
        all_items = ["Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig"]
        
        if search_term:
            filtered_items = [item for item in all_items 
                            if search_term in item.lower()]
        else:
            filtered_items = all_items
        
        self.filtered_list.values = filtered_items
        self.filtered_list.display()

class ListApp(npyscreen.NPSApp):
    def main(self):
        F = ListForm(name="List Example")
        F.edit()

if __name__ == '__main__':
    App = ListApp()
    App.run()

カスタムウィジェット

import npyscreen

class ProgressWidget(npyscreen.BoxTitle):
    _contained_widget = npyscreen.Slider
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.entry_widget.out_of = 100
        self.entry_widget.step = 1
    
    def set_progress(self, value):
        self.entry_widget.value = value
        self.display()
    
    def get_progress(self):
        return self.entry_widget.value

class CustomForm(npyscreen.Form):
    def create(self):
        self.progress = self.add(ProgressWidget,
                               name="Progress:",
                               value=50)
        
        self.increment_btn = self.add(npyscreen.MiniButtonPress,
                                    name="Increment")
        self.increment_btn.whenPressed = self.increment_progress
        
        self.decrement_btn = self.add(npyscreen.MiniButtonPress,
                                    name="Decrement")
        self.decrement_btn.whenPressed = self.decrement_progress
    
    def increment_progress(self):
        current = self.progress.get_progress()
        if current < 100:
            self.progress.set_progress(current + 10)
    
    def decrement_progress(self):
        current = self.progress.get_progress()
        if current > 0:
            self.progress.set_progress(current - 10)

class CustomApp(npyscreen.NPSApp):
    def main(self):
        F = CustomForm(name="Custom Widget Example")
        F.edit()

if __name__ == '__main__':
    App = CustomApp()
    App.run()

テーマとスタイリング

import npyscreen

# カスタムテーマの定義
class CustomTheme(npyscreen.ThemeManager):
    default_colors = {
        'DEFAULT': 'WHITE_BLACK',
        'FORMDEFAULT': 'WHITE_BLACK',
        'NO_EDIT': 'BLUE_BLACK',
        'STANDOUT': 'CYAN_BLACK',
        'CURSOR': 'WHITE_BLACK',
        'CURSOR_INVERSE': 'BLACK_WHITE',
        'LABEL': 'GREEN_BLACK',
        'LABELBOLD': 'CYAN_BLACK',
        'CONTROL': 'YELLOW_BLACK',
        'IMPORTANT': 'GREEN_BLACK',
        'SAFE': 'GREEN_BLACK',
        'WARNING': 'YELLOW_BLACK',
        'DANGER': 'RED_BLACK',
        'CRITICAL': 'BLACK_RED',
        'GOOD': 'GREEN_BLACK',
        'GOODHL': 'GREEN_BLACK',
        'VERYGOOD': 'BLACK_GREEN',
        'CAUTION': 'YELLOW_BLACK',
        'CAUTIONHL': 'BLACK_YELLOW',
    }

class ThemedForm(npyscreen.Form):
    def create(self):
        # テーマを適用したウィジェット
        self.title = self.add(npyscreen.TitleText,
                             name="Title:",
                             color='IMPORTANT')
        
        self.description = self.add(npyscreen.TitleText,
                                   name="Description:",
                                   color='CONTROL')
        
        self.status = self.add(npyscreen.TitleSelectOne,
                              name="Status:",
                              values=["Active", "Inactive"],
                              color='GOOD')

class ThemedApp(npyscreen.NPSApp):
    def main(self):
        # カスタムテーマを設定
        npyscreen.setTheme(CustomTheme)
        
        F = ThemedForm(name="Themed Application")
        F.edit()

if __name__ == '__main__':
    App = ThemedApp()
    App.run()

他のライブラリとの比較

特徴npyscreenTextualUrwidBlessed
フォーム管理優秀
ウィジェット豊富豊富豊富限定的
学習コスト
データ入力最適良好良好基本的
カスタマイズ

使用事例

  • データ入力アプリケーション: フォームベースのデータ収集
  • 設定管理ツール: システム設定の管理画面
  • データベース管理: レコードの編集・管理
  • 調査・アンケート: 対話型質問システム

コミュニティとサポート

  • 安定性: 長期間にわたる実績
  • ドキュメント: 詳細なAPIドキュメント
  • 例題: 豊富なサンプルコード
  • 互換性: Python 2/3対応

npyscreenは、フォーム中心の設計により複雑なデータ入力アプリケーションを効率的に構築できる、成熟したTUIフレームワークです。