13.1.13.4.4. Ví dụ đầy đủ#

Create Default Config ghi ra tệp bên dưới và mở nó. Đây là một bản demo -- không phải cấu hình thiết bị thực -- được dựng để sử dụng đồng thời mọi loại điều khiển: các label, cả hai loại vùng chứa, cả bảy điều khiển giá trị, ánh xạ options/values, một checkbox ba trạng thái, một spinbox hệ thập lục phân, một mặt nạ nhập liệu, một biểu thức chính quy, một trường mật khẩu, và một trường bị vô hiệu hóa. Đọc nó cùng với các trang tham chiếu để thấy từng khóa trong ngữ cảnh, rồi rút gọn xuống còn các thiết lập mà ứng dụng của riêng bạn cần.

{
  "title": "Camera Settings",
  "controls": [
    {
      "type": "label",
      "align": "center",
      "text": "<b>This is a demo configuration.</b><br/>The controls below are examples that show off every setting type you can build &mdash; they are <i>not</i> a real device config. Replace them with the controls your own application needs, then edit the values, click <b>Save</b>, and read them back in your script with <code>json.load()</code>. See the <a href='https://docs.openmv.io'>documentation</a> for details."
    },
    {
      "type": "tabs",
      "tab_position": "north",
      "tabs": [
        {
          "title": "Camera",
          "tooltip": "Sensor and capture settings",
          "controls": [
            { "type": "label", "text": "<b>Image capture</b>" },
            {
              "type": "group",
              "title": "Manual Exposure",
              "checkable": true,
              "name": "manual_exposure",
              "value": false,
              "controls": [
                { "type": "slider", "name": "exposure_us", "label": "Exposure", "value": 10000, "min": 0, "max": 33000, "step": 100, "suffix": " us", "ticks": 5500, "tooltip": "Shutter time in microseconds" },
                { "type": "slider", "name": "gain_db", "label": "Gain", "value": 8, "min": 0, "max": 24, "suffix": " dB", "ticks": 4 }
              ]
            },
            {
              "type": "group",
              "title": "Format",
              "controls": [
                { "type": "combobox", "name": "resolution", "label": "Resolution", "value": "qvga", "options": ["QQVGA", "QVGA", "VGA"], "values": ["qqvga", "qvga", "vga"] },
                { "type": "combobox", "name": "pixformat", "label": "Pixel Format", "value": 1, "options": ["Grayscale", "RGB565"] },
                { "type": "checkbox", "name": "h_mirror", "label": "Horizontal Mirror", "value": false },
                { "type": "checkbox", "name": "v_flip", "label": "Vertical Flip", "value": false },
                { "type": "slider", "name": "digital_zoom", "label": "Digital Zoom", "value": 1, "min": 1, "max": 8, "prefix": "x", "ticks": 1 }
              ]
            }
          ]
        },
        {
          "title": "Processing",
          "tooltip": "Detection and overlays",
          "controls": [
            {
              "type": "group",
              "title": "Detection",
              "controls": [
                { "type": "radio", "name": "mode", "label": "Mode", "value": "idle", "options": ["Idle", "Track", "Record"], "values": ["idle", "track", "record"], "orientation": "horizontal" },
                { "type": "slider", "name": "threshold", "label": "<b>Threshold</b>", "value": 50, "min": 0, "max": 100, "suffix": " %", "ticks": 25 },
                { "type": "spinbox", "name": "min_area", "label": "Min Area", "value": 100, "min": 0, "max": 10000, "suffix": " px", "special_value_text": "Off", "group_separator": true },
                { "type": "doublespinbox", "name": "sensitivity", "label": "Sensitivity", "value": 50, "min": 0, "max": 100, "step": 0.5, "decimals": 1, "suffix": " %", "special_value_text": "Auto" },
                { "type": "checkbox", "name": "draw_overlays", "label": "Draw Overlays", "value": true }
              ]
            },
            {
              "type": "group",
              "title": "Recording",
              "controls": [
                { "type": "radio", "name": "quality", "label": "Quality", "value": 1, "options": ["Low", "Medium", "High"] },
                { "type": "checkbox", "name": "capture_mode", "label": "Capture (off / single / continuous)", "tristate": true, "value": 1 }
              ]
            }
          ]
        },
        {
          "title": "Network",
          "tooltip": "Wi-Fi and server",
          "controls": [
            { "type": "label", "text": "<i>Network configuration</i>" },
            {
              "type": "group",
              "title": "Wi-Fi",
              "checkable": true,
              "name": "wifi_enabled",
              "value": true,
              "controls": [
                { "type": "lineedit", "name": "wifi_ssid", "label": "SSID", "value": "", "placeholder": "Network name", "max_length": 32, "clear_button": true },
                { "type": "lineedit", "name": "wifi_password", "label": "Password", "value": "", "password": true, "clear_button": true },
                { "type": "lineedit", "name": "static_ip", "label": "Static IP", "value": "192.168.001.100", "mask": "000.000.000.000;_", "tooltip": "Set to 0.0.0.0 for DHCP" }
              ]
            },
            {
              "type": "group",
              "title": "Server",
              "controls": [
                { "type": "spinbox", "name": "server_port", "label": "Port", "value": 8080, "min": 0, "max": 65535, "group_separator": true },
                { "type": "lineedit", "name": "hostname", "label": "Hostname", "value": "openmv-cam", "regex": "[A-Za-z0-9-]+", "placeholder": "letters, digits, dashes", "clear_button": true }
              ]
            }
          ]
        },
        {
          "title": "System",
          "tooltip": "Device and power",
          "controls": [
            {
              "type": "group",
              "title": "Device",
              "controls": [
                { "type": "lineedit", "name": "device_name", "label": "Device Name", "value": "openmv-cam", "clear_button": true },
                { "type": "combobox", "name": "led", "label": "LED", "value": 0, "options": ["Off", "Red", "Green", "Blue"] },
                { "type": "spinbox", "name": "i2c_address", "label": "I2C Address", "value": 48, "min": 0, "max": 255, "base": 16, "prefix": "0x" },
                { "type": "lineedit", "name": "firmware", "label": "Firmware", "value": "4.5.0", "enabled": false }
              ]
            },
            {
              "type": "group",
              "title": "Power",
              "controls": [
                { "type": "radio", "name": "power_mode", "label": "Power Mode", "value": "balanced", "options": ["Performance", "Balanced", "Low Power"], "values": ["perf", "balanced", "low"] },
                { "type": "slider", "name": "led_brightness", "label": "LED Brightness", "value": 80, "min": 0, "max": 100, "suffix": " %", "ticks": 20 }
              ]
            },
            {
              "type": "group",
              "title": "Storage",
              "controls": [
                { "type": "doublespinbox", "name": "storage_limit", "label": "Storage Limit", "value": 1024.5, "min": 0, "max": 65536, "step": 0.5, "decimals": 1, "prefix": "max ", "suffix": " MB", "group_separator": true }
              ]
            }
          ]
        }
      ]
    },
    {
      "type": "label",
      "align": "right",
      "text": "<i>Edit the values, then click Save.</i>"
    }
  ]
}

13.1.13.4.4.1. Đọc lại nó#

Bạn đã tạo bố cục này, nên bạn biết đường dẫn đến từng giá trị. Với hàm trợ giúp find từ tổng quan, hãy đặt tên cho tab và điều khiển -- find sẽ duyệt qua dải tab và bất kỳ nhóm không tên nào ở giữa:

enabled = find(config, "Camera", "manual_exposure")["value"]                   # the group's checkbox
exposure = find(config, "Camera", "manual_exposure", "exposure_us")["value"]   # 10000
resolution = find(config, "Camera", "resolution")["value"]                     # "qvga"

Group Manual Exposure có một name, nên nó là một bước trong đường dẫn -- và find(config, "Camera", "manual_exposure") đọc ô đánh dấu của nó. Group Format không có name, nên nó trong suốt: resolution được truy cập thẳng từ thẻ Camera.

Lưu ý cách combobox với một mảng values trả về giá trị được lưu ("qvga"), không phải nhãn mà người dùng đã chọn ("QVGA") -- chính xác là thứ mà một script muốn rẽ nhánh theo đó.