New three-column label format for Brother P-touch EDGE PT-E560BT asset tags:
logo | three static lines + variable field | QR code.
Layout and rendering
- ptouch_label.py: geometry engine with PDF and preview renderers. Both
consume the same geometry, so the preview matches the print exactly.
- Code symbols are snapped to whole printer dots per module. Fractional
modules are the usual reason a small QR code will not scan.
- QR is maximised to the printable height by default (16.4 mm, 4 dots per
module) instead of a fixed 16 mm box (12.3 mm, 3 dots per module).
- Code payload is composed as prefix + inventory + suffix. A legacy
{inventory} template is migrated on first save.
Hardware handling
- print_area.py reads the driver's real printable area via GetDeviceCaps.
The PT-E560BT head is 128 dots at 180 dpi, so the maximum print height is
18.06 mm even on 24 mm tape; the driver reports media as 65x24 mm but only
about 61x18 mm is reachable. Content is fitted to the reachable area,
otherwise the driver silently crops it.
- set_printer_resolution.py reads/switches the driver's resolution mode. The
driver offers 180x180 (symmetric) and 180x360 (anisotropic, 2x across the
tape); the anisotropic mode scaled output incorrectly.
GUI
- label_printer_ptouch_gui.py: 600x300 two-column panel - controls on the
left, live preview on the right. Advanced settings for logo, static lines,
code prefix/suffix and error correction.
- native_file_dialog.py: the standard Windows file picker, run in a
subprocess because Tk and Kivy both want the main event loop.
Printing
- Print failures are reported honestly. print_to_printer previously returned
True unconditionally, so a failed print claimed success and was logged as
SUCCESS.
- SumatraPDF exit codes are now checked (4 = no printer, 5 = driver error).
- The PDF is sent with noscale so driver-side scaling cannot distort the QR
module pitch.
Tests
- validate_ptouch_layout.py decodes the QR back out of the rendered preview
module by module, proving the preview and PDF are the same layout.
- test_ptouch_pipeline.py writes to a temp config so it cannot overwrite
operator settings.
- test_gui_layout.py exercises the real app class headlessly.
- test_print_reporting.py covers the failure paths.
Diagnostics: check_print_area.py, check_print_geometry.py, check_devmode.py,
print_calibration.py, print_measure_scale.py, capture_print_job.py.
2.9 KiB
P-touch Labels for Asset
Barcode label printing for Brother P-touch EDGE PT-E560BT asset tags.
Generates a three-column label sized to the printer's real printable area, with a logo, three lines of fixed text plus a variable field, and a QR code that encodes a composed string. Includes a preview that matches the print exactly, and a Kivy GUI for operators.
0 20 mm 45 mm 63 mm
+---------+------------+--------+
| | static 1 | QR |
| LOGO | static 2 | CODE |
| 16x16 | static 3 | |
| | VARIABLE | |
+---------+------------+--------+
Install
pip install -r requirements_ptouch.txt
Run
python label_printer_ptouch_gui.py # operator GUI (Kivy)
The original three-row format is still available via label_printer_gui.py and
is unchanged.
Configuration
Operator settings live in label_config.json (not committed - it holds a local
logo path). Edit them in Advanced settings in the GUI:
| Setting | Purpose |
|---|---|
| Logo image | PNG/JPG for the first column, with a thumbnail preview |
| Static text lines | The three fixed lines |
| Code prefix / suffix | Code payload is prefix + inventory + suffix |
| QR error correction | L (shortest) to H (most robust) |
Hardware notes
The PT-E560BT has a 128-dot print head at 180 dpi, so the maximum print height is 18.06 mm even on 24 mm tape. The label is therefore fitted to the driver's printable area (~61 x 18 mm), read at runtime, rather than to the nominal media size (65 x 24 mm).
The driver exposes two resolution modes; use the symmetric one:
python set_printer_resolution.py --mode 180
See documentation/PTOUCH_63x20.md for the full layout, code-composition and dot-alignment details.
Diagnostics
| Script | Purpose |
|---|---|
check_print_area.py |
Driver page and printable area (authoritative GetDeviceCaps) |
check_print_geometry.py |
Compares our PDF page against the driver's media |
check_devmode.py |
Dumps the full driver DEVMODE |
set_printer_resolution.py |
Read/switch the driver resolution mode |
print_calibration.py |
Label with ruler marks, for measuring on tape |
print_measure_scale.py |
Measures the actual X/Y scale factors |
capture_print_job.py |
Captures raw bytes sent to the printer |
Tests
python validate_ptouch_layout.py # geometry + QR round-trip from rendered pixels
python test_ptouch_pipeline.py # config, PDF, print path (uses a temp config)
python test_gui_layout.py # GUI wiring, headless
python test_print_reporting.py # print failures are reported honestly
validate_ptouch_layout.py decodes the QR back out of the rendered preview,
module by module, which is what proves the preview and the PDF are the same
layout and that the symbol survives dot-alignment.