Sane
Sane copied to clipboard
sane.Option doesn't properly handle buttons named "scan"
I have a couple of scanners (a Fujitsu SnapScan 1500 and a Canon CanoScan LiDE 210) that have front-panel buttons that can initiate scans. Unfortunately, the primary scan buttons are named "scan" and that collides with the bound method to ask the scanner to begin scanning.
>>> import sane
>>>
>>> sane.init()
(16777247, 1, 0, 31)
>>> sane.get_devices()
[('genesys:libusb:001:008', 'Canon', 'LiDE 210', 'flatbed scanner'), ('fujitsu:ScanSnap S1500:56050', 'FUJITSU', 'ScanSnap S1500', 'scanner')]
>>>
>>> scanner = sane.open('fujitsu:ScanSnap S1500:56050')
>>> scanner.opt['scan']
Name: scan
Cur value: <bound method SaneDev.scan of <sane.SaneDev object at 0x7f8567e60f40>>
Index: 91
Title: Scan button
Desc: Scan button
Type: TYPE_BOOL
Unit: UNIT_NONE
Constr: None
active: yes
settable: no
Modifying sane.py
on line 307 to change the method name from scan
to, say, doscan
"fixes" the issue for me:
>>> scanner.opt['scan']
Name: scan
Cur value: 0
Index: 91
Title: Scan button
Desc: Scan button
Type: TYPE_BOOL
Unit: UNIT_NONE
Constr: None
active: yes
settable: no
I'm not sure what the proper way to fix this for real. :/
For future readers, I managed to get around it this way (by poking at the code), which return the current value of the button (1 or 0 if pressed or not respectively) with a bit of a delay
scanner.dev.get_option(scanner['scan'].index)
Not sure how I would get that to launch a scan action, apart from polling it constantly. Not an expert in sane.
Complete polling example
import sane
sane.init()
scanner = sane.open(sane.get_devices()[0][0])
import datetime
from datetime import datetime
while True:
print(datetime.now().isoformat(), 'pressed?', scanner.dev.get_option(scanner['scan'].index))