ワンクリックで
python-development
Python and wxPython development: packaging (PyInstaller/Nuitka), testing, desktop accessibility APIs, cross-platform paths, and framework patterns.
メニュー
Python and wxPython development: packaging (PyInstaller/Nuitka), testing, desktop accessibility APIs, cross-platform paths, and framework patterns.
SOC 職業分類に基づく
Use for web accessibility work in HTML, JSX, CSS, ARIA, keyboard, forms, contrast, modals, live regions, headings, links, tables, or WCAG review; starts accessibility-lead first and uses tool_search if subagent tools are lazy-loaded.
Developer tools accessibility router for Python, wxPython, desktop accessibility APIs, NVDA add-ons, scanner tooling, CI tooling, and accessibility developer experience.
Document accessibility router for Word, Excel, PowerPoint, PDF, EPUB, Office remediation, PDF remediation, and accessible generated documents.
GitHub workflow accessibility router for PR review, issues, Actions, releases, projects, security alerts, notifications, repository management, and accessible contributor workflows.
Markdown accessibility router for docs, README files, headings, links, tables, alt text, diagrams, generated docs, and publication-ready accessible markdown.
Compute web accessibility scores (0-100, A-F grades) with severity scoring, confidence levels, and remediation tracking across audits.
| name | python-development |
| description | Python and wxPython development: packaging (PyInstaller/Nuitka), testing, desktop accessibility APIs, cross-platform paths, and framework patterns. |
Reference data for the Developer Hub, Python Specialist, and wxPython Specialist agents.
| Version | Key Features | EOL |
|---|---|---|
| 3.10 | match/case, X | Y unions, ParamSpec | Oct 2026 |
| 3.11 | Exception groups, Self type, tomllib, faster CPython | Oct 2027 |
| 3.12 | Type parameter syntax def f[T](), @override, f-string nesting | Oct 2028 |
| 3.13 | Experimental free-threaded mode, improved error messages | Oct 2029 |
| 3.14 | async pdb.set_trace_async(), template strings (PEP 750) | Oct 2030 |
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "my-app"
version = "1.0.0"
requires-python = ">=3.10"
dependencies = []
[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff>=0.6", "mypy>=1.11"]
[project.scripts]
myapp = "my_app.__main__:main"
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra --strict-markers"
[tool.ruff]
target-version = "py310"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "SIM", "TCH"]
[tool.mypy]
python_version = "3.10"
strict = true
exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas,
name='MyApp', console=False, icon='icon.ico')
exe = EXE(pyz, a.scripts, exclude_binaries=True,
name='MyApp', console=False, icon='icon.ico')
coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, name='MyApp')
pkg_resources.externaccessible_output2 (for a11y desktop apps)keyring.backends (for credential storage)platformdirshttpx._transports / httpcore._backendsencodings (always needed)| Sizer | When to Use |
|---|---|
wx.BoxSizer(wx.VERTICAL) | Stack items top-to-bottom |
wx.BoxSizer(wx.HORIZONTAL) | Lay items left-to-right |
wx.GridBagSizer(vgap, hgap) | Form layouts with labels + controls |
wx.FlexGridSizer(rows, cols, vgap, hgap) | Even grid layouts |
wx.WrapSizer | Flow layout that wraps |
wx.StaticBoxSizer(wx.VERTICAL, parent, "Label") | Grouped controls with border |
# From worker thread:
wx.CallAfter(self.update_status, "Done")
wx.PostEvent(self, CustomEvent(data=result))
# NEVER do this from a worker thread:
self.status_bar.SetStatusText("Done") # CRASH or CORRUPTION
| ID | Purpose |
|---|---|
wx.ID_OK | OK button |
wx.ID_CANCEL | Cancel button |
wx.ID_SAVE | Save action |
wx.ID_OPEN | Open action |
wx.ID_EXIT | Exit / Quit |
wx.ID_HELP | Help action |
wx.ID_NEW | New document |
wx.ID_UNDO / wx.ID_REDO | Undo / Redo |
| Event | Trigger |
|---|---|
wx.EVT_BUTTON | Button click |
wx.EVT_MENU | Menu item selected |
wx.EVT_CLOSE | Window close requested |
wx.EVT_SIZE | Window resized |
wx.EVT_TIMER | Timer fired |
wx.EVT_TEXT | Text control content changed |
wx.EVT_LIST_ITEM_SELECTED | List item selected |
wx.EVT_TREE_SEL_CHANGED | Tree selection changed |
wx.EVT_UPDATE_UI | UI state update check |
def f(items=[]) shares the list across calls. Use None and create inside.lambda: x in a loop captures the variable, not the value. Use lambda x=x: x.TYPE_CHECKING block, or restructure modules.field() outside dataclass: field() is only valid inside @dataclass classes. Use plain type annotations elsewhere.is vs ==: is checks identity, == checks equality. Use is only for None, True, False."".join() or io.StringIO instead.wx.CallAfter() or wx.PostEvent().event.Skip(): Other handlers won't fire. Call event.Skip() unless you intentionally consume the event.EVT_CLOSE handler to prevent callbacks after destruction._mgr.UnInit() in close handler.with MyDialog(...) as dlg:) for automatic cleanup.SetPosition() or SetSize() for layout. Always use sizers.from platformdirs import user_config_dir, user_data_dir, user_cache_dir
config = user_config_dir("MyApp", "MyCompany") # %APPDATA% / ~/Library/... / ~/.config/
data = user_data_dir("MyApp", "MyCompany")
cache = user_cache_dir("MyApp", "MyCompany")
# Run all tests
pytest
# Run specific test file
pytest tests/test_queue.py
# Run specific test
pytest tests/test_queue.py::test_submit_job -v
# With coverage
pytest --cov=mypackage --cov-report=term-missing
# Stop on first failure
pytest -x
# Show locals on failure
pytest -l
import logging
def setup_logging(level: int = logging.INFO) -> None:
logging.basicConfig(
level=level,
format="%(asctime)s %(name)s %(levelname)s %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
# Quiet noisy libraries
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("httpcore").setLevel(logging.WARNING)
| Platform | API | Python Binding | Use For |
|---|---|---|---|
| Windows | UI Automation (UIA) | comtypes, pywinauto | Modern apps, NVDA/Narrator |
| Windows | MSAA / IAccessible2 | comtypes, pywinauto | Legacy apps, JAWS |
| macOS | NSAccessibility | pyobjc | VoiceOver |
# Name every control that lacks a visible label
# CORRECT: use StaticText immediately before the control in the sizer
label = wx.StaticText(panel, label="Scan progress:")
# ctrl = wx.Gauge(panel) -- add label to sizer right before ctrl
# WRONG: SetName() is ignored by screen readers
# ctrl.SetName("Scan progress") -- only affects FindWindowByName()
# Tab order follows sizer insertion order; override with:
ctrl2.MoveAfterInTabOrder(ctrl1)
# Keyboard shortcuts via accelerator table
accel = wx.AcceleratorTable([
(wx.ACCEL_CTRL, ord('S'), wx.ID_SAVE),
(wx.ACCEL_CTRL, ord('Q'), wx.ID_EXIT),
])
frame.SetAcceleratorTable(accel)
# Platform-correct button order in dialogs
sizer.Add(dialog.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL))
Screen readers expose controls as: Name + Role + Value + State
| Property | wxPython Source | Example |
|---|---|---|
| Name | Preceding wx.StaticText, label= parameter, or SetToolTip() | "Scan progress" |
| Role | Widget type (automatic) | button, text field, list |
| Value | Widget content | "75%", "Hello world" |
| State | Widget flags | focused, disabled, checked |
wx.StaticText for inputs, label= for buttons, SetToolTip() for image-only controls)CreateStdDialogButtonSizer() for platform-correct button orderWhen audit mode is activated, agents use these structured detection rule sets:
| Rule Prefix | Agent | Scope | Count |
|---|---|---|---|
| WX-A11Y-001..012 | wxpython-specialist | wxPython-specific patterns (StaticText labels, AcceleratorTable, mouse-only events, dialogs) | 12 rules |
| DTK-A11Y-001..012 | desktop-a11y-specialist | Platform-level API patterns (Name/Role/State/Value, focus, UIA/NSAccessibility) | 12 rules |
| TST-A11Y-001..010 | desktop-a11y-testing-coach | Test coverage gaps (automated tests, SR testing, keyboard plans, CI integration) | 10 rules |
Rule sets don't overlap -- WX covers wxPython widget patterns, DTK covers platform APIs, TST covers testing process gaps.
For deeper expertise, the skill routes to these specialists:
desktop-a11y-specialist -- Platform API implementation, wx.Accessible, custom widget patterns (DTK-A11Y-* audit rules)desktop-a11y-testing-coach -- NVDA/JAWS/Narrator testing, Accessibility Insights, automated UIA tests (TST-A11Y-* audit rules)a11y-tool-builder -- Rule engine architecture, document parsers, severity scoring, report generators