用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/tomevault-io/skills-registry --skill widget-creation命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | widget-creation |
| description | Use when: creating new TTkWidget subclasses with proper structure, signals, slots, and documentation |
This skill scaffolds new pyTermTk widgets following project patterns:
__slots__Location: libs/pyTermTk/TermTk/TTkWidgets/ttk_<widget_name>.py
Template:
"""
Module: TTkMyWidget
Implements a custom widget for [purpose]
"""
from TermTk import TTkWidget, TTkColor, pyTTkSignal, pyTTkSlot
class TTkMyWidget(TTkWidget):
'''TTkMyWidget: [One-line description]
[Longer description of purpose and behavior]
(`demo <https://ceccopierangiolieugenio.github.io/pyTermTk-Docs/sandbox/...>`__)
::
[ASCII art showing visual representation]
[Multiple lines if needed]
.. code:: python
import TermTk as ttk
root = ttk.TTk()
widget = ttk.TTkMyWidget(parent=root)
root.mainloop()
'''
# Performance: always use __slots__
__slots__ = (
'_privateVar',
'_anotherVar',
'stateChanged',
)
_privateVar: int
_anotherVar: int
stateChanged: pyTTkSignal
'''
Emitted when widget state changes.
:param value: new state value
:type value: [type]
'''
# Class-level styling
classStyle = {
'default': {'color': TTkColor.fg("#dddd88"), 'borderColor': TTkColor.RST},
'hover': {'color': TTkColor.fg("#ffffff"), 'borderColor': TTkColor.BOLD},
'focus': {'borderColor': TTkColor.fg("#ffff00")},
'disabled': {'color': TTkColor.fg('#888888')}
}
def __init__(self, **kwargs):
'''Initialize the widget.
:param parent: parent widget
:type parent: TTkWidget
[Other parameters as needed]
'''
# Instantiate signals in __init__ (do not instantiate at class level)
self.stateChanged = pyTTkSignal(int)
# Initialize private variables
self._privateVar = 0 # Replace with appropriate default for your widget
# Call parent with merged kwargs and default size
super().__init__(**kwargs|{'size': (10, 3)}) # Replace with appropriate default dimensions
# Property getters/setters
def getValue(self) -> int:
'''Get the current value.
:return: current value
:rtype: int
'''
return self._privateVar
def setValue(self, value: int) -> None:
'''Set the value.
:param value: new value
:type value: int
'''
if self._privateVar != value:
self._privateVar = value
self.stateChanged.emit(value)
self.update()
# Return True when this widget fully processes the event; otherwise return False to let parent widgets handle it.
def keyEvent(self, evt) -> bool:
'''Handle keyboard events.'''
if evt.key == 'Enter':
self.stateChanged.emit(self._privateVar)
return True
return False
def mousePressEvent(self, evt) -> bool:
'''Handle mouse press events.'''
# Handle click, return True if consumed
return False
def paintEvent(self) -> None:
'''Render the widget.'''
# Use currentStyle() for theme-aware colors
canvas = self.canvas
style = self.currentStyle()
# Draw widget content
canvas.drawText(pos=(0, 0), text="MyWidget")
__all__ = ['TTkMyWidget']
Location: tests/pytest/widgets/<widget_name>/test_<widget_name>.py
Template:
import pytest
from TermTk import TTkMyWidget
class TestTTkMyWidget:
'''Test suite for TTkMyWidget'''
def test_initialization(self):
"""Widget initializes with defaults"""
widget = TTkMyWidget()
assert widget.getValue() == 0 # Or expected default
def test_signal_emission(self):
"""Signal emits when state changes"""
widget = TTkMyWidget()
emitted = []
widget.stateChanged.connect(lambda val: emitted.append(val))
widget.setValue(42)
assert emitted == [42]
def test_key_event_handling(self):
"""Key events handled correctly"""
widget = TTkMyWidget()
from TermTk import TTkKeyEvent
evt = TTkKeyEvent(key='Enter')
result = widget.keyEvent(evt)
assert result == True # Event was handled
def test_disabled_state(self):
"""Widget respects disabled state"""
widget = TTkMyWidget()
widget.setDisabled(True)
# Verify widget doesn't respond to events, etc.
Add to demo/showcase/ or tutorial/examples/ if creating showcase:
"""
Example: TTkMyWidget
Demonstrates the TTkMyWidget in action.
"""
import TermTk as ttk
def main():
root = ttk.TTk()
# Create and configure widget
widget = ttk.TTkMyWidget(parent=root)
widget.setValue(10)
# Connect signal
@ttk.pyTTkSlot(int)
def on_state_changed(value):
print(f"State changed to: {value}")
widget.stateChanged.connect(on_state_changed)
root.mainloop()
if __name__ == '__main__':
main()
__slots__ and type-annotate them there__init__ with specific type: pyTTkSignal(int) not pyTTkSignal()self.stateChanged.emit(value)__slots__ = (
'_variable1',
'_variable2',
'valueChanged',
# Always use slots for memory efficiency
)
_variable1: int
_variable2: int
valueChanged: pyTTkSignal
Rules:
_.__slots__.classStyle = {
'default': {...},
'hover': {...},
'focus': {...},
'disabled': {...}
}
True if event fully handled (don't propagate)False to let event propagate up widget tree:py:class:, :py:meth:libs/pyTermTk/TermTk/TTkWidgets/ttk_*.pyTTkWidget or TTkContainer__slots__ defined___all__ export definedlibs/pyTermTk/TermTk/TTkWidgets/__init__.py with from .ttk_<widget_name> import TTkMyWidget__init____init____slots__ (memory waste)currentStyle()Source: ceccopierangiolieugenio/pyTermTk — distributed by TomeVault.