npyscreen
Pythonのncursesベースのアプリケーションフレームワーク。フォーム、ウィジェット、テーマシステムを提供し、複雑なTUIアプリケーションの構築をサポートします。
GitHub概要
npcole/npyscreen
Automatically exported from code.google.com/p/npyscreen
スター500
ウォッチ19
フォーク112
作成日:2015年5月5日
言語:Python
ライセンス:Other
トピックス
なし
スター履歴
データ取得日時: 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()
他のライブラリとの比較
特徴 | npyscreen | Textual | Urwid | Blessed |
---|---|---|---|---|
フォーム管理 | 優秀 | 中 | 中 | 低 |
ウィジェット | 豊富 | 豊富 | 豊富 | 限定的 |
学習コスト | 中 | 中 | 高 | 低 |
データ入力 | 最適 | 良好 | 良好 | 基本的 |
カスタマイズ | 中 | 高 | 高 | 低 |
使用事例
- データ入力アプリケーション: フォームベースのデータ収集
- 設定管理ツール: システム設定の管理画面
- データベース管理: レコードの編集・管理
- 調査・アンケート: 対話型質問システム
コミュニティとサポート
- 安定性: 長期間にわたる実績
- ドキュメント: 詳細なAPIドキュメント
- 例題: 豊富なサンプルコード
- 互換性: Python 2/3対応
npyscreenは、フォーム中心の設計により複雑なデータ入力アプリケーションを効率的に構築できる、成熟したTUIフレームワークです。