python-pillow / Sane

Python interface to the SANE scanner and frame grabber
Other
54 stars 19 forks source link

sane.Option doesn't properly handle buttons named "scan" #71

Open BonkaBonka opened 3 years ago

BonkaBonka commented 3 years ago

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. :/

olethanh commented 1 year ago

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))