[教學] NVDA附加元件開發大家一起來 - 討論區

[教學] NVDA附加元件開發大家一起來

visibility文章瀏覽次數 421 reply_all文章回覆數 9

coscell

coscell圖像(預設)

2019-09-09 13:00:42

From:123.193.249.19

NVDA附加元件不僅能讓NVDA使用更有彈性、用途更加豐富,附帶的還能讓程式學習者增加觀摩和練功的機會,門檻又不高,值得多加利用。
哪怕不會或不熟 python, 只要會寫程式,不管用什麼語言都能發揮長才做出貢獻。
下面就拿官方 NVDA Add-on Development Guide 提供的最簡單的範例來詳加說明,最後再以這個範例為框架套上自己用其他語言撰寫的程式來完成自己的NVDA附加元件。
為了方便說明,下面的程式碼我加上了編號,其中有 * 者為必要照抄,其他都可自行增刪。

1 # Add-on development first example

2* import globalPluginHandler
3 import tones

4* class GlobalPlugin(globalPluginHandler.GlobalPlugin):
5 def script_doBeep(self, gesture):
6 tones.beep(440, 1000)

7 __gestures={ "kb:NVDA+A":"doBeep" }

什麼,只有七行就寫成了一個NVDA附加元件?!
沒錯,就是這麼簡單!是驢是馬拉出來遛遛便知。不信就來試試:
首先將程式碼複製貼到記事本,把每行開頭的三個字元刪除,存成 mytest.py 並複製,接著以 nvda-2019.2 為例:

  1. NVDA功能表 -> 偏好設定 -> 設定 -> 進階
  2. 勾選我了解更改這些設定可能會導致 NVDA 執行異常。
  3. 勾選啟用從開發者的目錄中載入程式碼
  4. 按下開啟開發者的scratchpad目錄
  5. 進入 globalPlugins 資料夾
  6. 貼上 mytest.py
  7. 重啟 nvda
  8. 按 NVDA+A

有聽到嗶嗶聲了嗎?恭喜測試成功!
接下來就解釋程式碼:

  1. 這是註解說明。
  2. 載入 globalPluginHandler 模組。
    NVDA附加元件有四種:通用、特定軟體、語音驅動和點字驅動。
    這個範例屬於通用,所以必須載入這個模組。
  3. 載入 tones 模組。
    因為要發出嗶嗶聲所以載入這個模組。
  4. 建立一個名為 GlobalPlugin 的類別。
    這個類別繼承自 globalPluginHandler 模組的 GlobalPlugin 類別, 5-7 是新增的內容。
  5. 定義一個由按鍵觸發的 doBeep 函數,第 6 行為函數內容。
  6. 呼叫 tones 模組的 beep 函數發出頻率 440HZ, 長度 1000MS(一秒鐘)的嗶嗶聲。
  7. 定義按鍵 NVDA+A 觸發 doBeep 函數。

了解了這個簡單的附加元件框架,只要稍微修改就能套用其他語言寫的程式。
假設我們已經寫了一個遊戲,主程式檔名為 mygame.exe, 可以如下修改這個範例並如上存檔為 mygame.py,我把說明寫在行末:

3 import os # 載入 os 模組以便處理檔案路徑
3.1import subprocess # 載入 subprocess 模組以便執行外部程式

3.2dir = os.path.dirname(file) # 指定 dir 變數存放 mygame.py 所在資料夾

5 def script_game(self, gesture): # 更改函數名稱
6 subprocess.Popen([os.path.join(dir, "mygame.exe")]) # 執行遊戲主程式
7 __gestures={ "kb:NVDA+A":"game" } # 修改呼叫的函數

最後是打包附加元件:

  1. 建立並進入資料夾 mygame
  2. 新增資料夾 globalPlugins
  3. 複製 mygame.py 與 mygame.exe 到 globalPlugins
  4. 回到 mygame 用記事本建立 manifest.ini 內容如下:
    name = mygame
    summary = "我的遊戲"
    description = """這是我寫的第一個附加元件"""
    author = 作者姓名
    version = 1.0
    minimumNVDAVersion = 2017.3
    lastTestedNVDAVersion = 2019.3
  5. 在 mygame 資料夾內進行全選並壓縮成 mygame.zip 然後把它更名為 mygame.nvda-addon

安裝執行就不必說了,記得要先把剛剛測試的 mytest.py 移除。
等待您的作品,加油!
※最後更新時間:2019-09-09 13:18:29 From:123.193.249.19 By:coscell

留言

#1

特種兵

特種兵圖像(預設)

2019-09-09 17:35:22

From:211.23.21.202

原來高點是這樣包出來的
現在新版NVDA可以設定是否從用戶端載入自己寫的附加元件就更佳彈性了
我一直沒有時間去研究NVDA的source看架構,
用python都是寫一些小工具比較多
寫附加元件是我的一個目標。

#2

特種兵

特種兵圖像(預設)

2020-02-09 15:24:28

From:1.161.151.30

剛剛試了一下沒有成功,
不管是放在 scratchpad 或者包成 addon 都不行
包成 addon 執行時出現
錯誤 無法開啟D:\mytest\mytest.nvda-addon附加元件檔案-檔案可能遺失或無效的格式
看了一下官方 NVDA develope guide 直接貼範例過來也不行
我這邊是 NVDA 2019.2.1 壓縮工具是 7z 選擇 zip 壓縮
目前還再找原因中

#3

coscell

coscell圖像(預設)

2020-02-09 16:59:45

From:180.176.111.5

問題比較可能出在 manifest
po 一下類容。

#4

特種兵

特種兵圖像(預設)

2020-02-09 22:42:42

From:1.161.151.30

name = "mygame"
summary = "我的遊戲"
description = """這是我寫的第一個附加元件"""
author = "作者姓名"
version = 1.0
minimumNVDAVersion = 2017.3
lastTestedNVDAVersion = 2019.2.1

#5

coscell

coscell圖像(預設)

2020-02-10 10:33:12

From:180.176.111.5

裡面有中文,存檔要選 utf-8.

#6

特種兵

特種兵圖像(預設)

2020-02-10 11:03:48

From:211.23.21.202

有注意到,但還是一樣
也試過全部改成英文

#7

coscell

coscell圖像(預設)

2020-02-10 11:52:30

From:180.176.111.5

願意的話可以寄給我是試看

#8

coscell

coscell圖像(預設)

2020-02-11 14:25:19

From:180.176.111.5

檢查測試了半天找不出問題所在,
最後回到Linux看才發現你的 manifest.ini 檔名用大寫,改過來就解決了。

#9

特種兵

特種兵圖像(預設)

2020-02-11 20:11:46

From:1.161.151.30

非常感謝,我沒注意到,果然可以了