Via the C-interface, it is perfectly possible to push virtual buttons, simply by using set_option() with an arbitrary value. The python bindings prevent this, however:
>>> import sane
>>> sane.init()
(16842753, 1, 1, 1)
>>> scanner=sane.open("test")
>>> scanner.enable_test_options = True
>>> scanner.button = True
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.10/site-packages/sane.py", line 196, in __setattr__
raise AttributeError("Buttons don't have values: " + key)
AttributeError: Buttons don't have values: button
Via the C-interface, it is perfectly possible to push virtual buttons, simply by using set_option() with an arbitrary value. The python bindings prevent this, however: