安装
1 | pip install pytwain |
官方方式
注意
调用扫描要在主进程中执行,否则无法获取扫描的回调。
测试
这种方式会在32位的Python下加载twain_32.dll
,在64位的Python下加载twaindsm.dll
,在32和64位下均能正常运行。
1 | import logging |
工具类
1 | # This Python file uses the following encoding: utf-8 |
Qt Quick中传入parent_window
twain.SourceManager
要传入parent_window
,但是源码中是这样判断的
1 | self._hwnd = 0 |
可以看到如果我们的窗口是Tk, Wx or Gtk window,则是没问题的
但是Qt的窗口是PySide2.QtQuick.QQuickWindow
1 | root_window = engine.rootObjects()[0] |
所以直接传窗口对象是不行的
可以传入句柄
1 | root_window = engine.rootObjects()[0] |
使用TWAINDSM
这种方式我在Qt Quick中如果Python是64位是没问题的,但是32位的时候就不行
扫描测试
1 | # This Python file uses the following encoding: utf-8 |
测试
1 | output_directory = r"D:\test" |
驱动无法调用
这种情况可能是TWAINDSM.dll
的位数不匹配。
twain-dsm-2.5.1.zip
https://pan.baidu.com/s/1kM7Pbvzh2QVQyKlAnTNxSA?pwd=w7id
我这里DLL放在项目根目录下的dll\twain\32\TWAINDSM.dll
根据程序是32位还是64位选择性加载即可。
1 | sm = twain.SourceManager(0, dsm_name=r"dll\twain\32\TWAINDSM.dll") |
打包时
添加项目下dll
1 | pyinstaller main.py -y --noconsole --name="xhscanner-client" --icon="logo.ico" --add-binary "dll\twain\32\TWAINDSM.dll;." |
上面这种方式TWAINDSM.dll
会放在_internal
目录中,这样虽然路径变了,但是_internal
根路径的DLL因为可以正常加载,所以可以正常使用。
获取Python位数
这是获取Python运行环境的位数,也就是我们程序的位数,不是系统的位数。
z_sys_utils.py
1 | import sys |
完整示例
1 | import logging |