How to Scan QR Code from Desktop Screen in Python

In our life, we usually take out smartphone to scan QR code. But when we are working on a computer, smartphone may not be the best choice for scanning QR codes that appear on web pages. One reason is the pictures taken from a monitor screen have the Moire’ patterns which interfere QR code recognition. The other reason is you may want to use the decoded information directly on PC, such as a URL for opening a website. This article will implement a simple tool with Python to facilitate QR code recognition on desktop screen.

Installation

The required Python packages include PIL, OpenCV, Dynamsoft Barcode Reader and Qt.

python3 <span>-m</span> pip <span>install </span>pillow opencv-python dbr pyside2
python3 <span>-m</span> pip <span>install </span>pillow opencv-python dbr pyside2
python3 -m pip install pillow opencv-python dbr pyside2

Enter fullscreen mode Exit fullscreen mode

Barcode SDK License

To unlock the capabilities of Dynamsoft Barcode SDK, you’d better apply for a 30-day free trial license.

Scanning QR Code from Screen

Since I have implemented a GUI barcode reader using Qt for Python, OpenCV and Dynamsoft Barcode Reader, the remaining stuff is to add screen snipping functionality. Inspired by https://github.com/harupy/snipping-tool, I learned the steps of implementing the screenshot functionality:

  1. Create a custom Qt widget and put it on top of the screen.
  2. Draw the selected area in paintEvent() function while moving the mouse.
  3. As the mouse is released, call PIL.ImageGrab.grab() to get the image of the selected area.

Add buttons for snipping events

We open the design.ui file in Qt Creator and add two buttons for triggering the snipping events.

Save the file and recompile design.ui to design.py:

pyside2-uic design.ui <span>-o</span> design.py
pyside2-uic design.ui <span>-o</span> design.py
pyside2-uic design.ui -o design.py

Enter fullscreen mode Exit fullscreen mode

In app_advanced.py, the two new buttons should be recognizable now. Connect them to slot functions:

<span>self</span><span>.</span><span>ui</span><span>.</span><span>pushButton_area</span><span>.</span><span>clicked</span><span>.</span><span>connect</span><span>(</span><span>self</span><span>.</span><span>snipArea</span><span>)</span>
<span>self</span><span>.</span><span>ui</span><span>.</span><span>pushButton_full</span><span>.</span><span>clicked</span><span>.</span><span>connect</span><span>(</span><span>self</span><span>.</span><span>snipFull</span><span>)</span>
<span>self</span><span>.</span><span>ui</span><span>.</span><span>pushButton_area</span><span>.</span><span>clicked</span><span>.</span><span>connect</span><span>(</span><span>self</span><span>.</span><span>snipArea</span><span>)</span>
<span>self</span><span>.</span><span>ui</span><span>.</span><span>pushButton_full</span><span>.</span><span>clicked</span><span>.</span><span>connect</span><span>(</span><span>self</span><span>.</span><span>snipFull</span><span>)</span>
self.ui.pushButton_area.clicked.connect(self.snipArea) self.ui.pushButton_full.clicked.connect(self.snipFull)

Enter fullscreen mode Exit fullscreen mode

Create a custom Qt widget

Create a SnippingTool.py file, in which we create a custom Qt widget:

<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>cv2</span>
<span>from</span> <span>PIL</span> <span>import</span> <span>ImageGrab</span>
<span>from</span> <span>PySide2</span> <span>import</span> <span>QtWidgets</span><span>,</span> <span>QtCore</span><span>,</span> <span>QtGui</span>
<span>from</span> <span>PySide2.QtCore</span> <span>import</span> <span>Qt</span>
<span>class</span> <span>SnippingWidget</span><span>(</span><span>QtWidgets</span><span>.</span><span>QWidget</span><span>):</span>
<span>is_snipping</span> <span>=</span> <span>False</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>parent</span><span>=</span><span>None</span><span>,</span> <span>app</span><span>=</span><span>None</span><span>):</span>
<span>super</span><span>(</span><span>SnippingWidget</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
<span>self</span><span>.</span><span>parent</span> <span>=</span> <span>parent</span>
<span>self</span><span>.</span><span>setWindowFlags</span><span>(</span><span>Qt</span><span>.</span><span>WindowStaysOnTopHint</span><span>)</span>
<span>self</span><span>.</span><span>screen</span> <span>=</span> <span>app</span><span>.</span><span>primaryScreen</span><span>()</span>
<span>self</span><span>.</span><span>setGeometry</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>width</span><span>(),</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>height</span><span>())</span>
<span>self</span><span>.</span><span>begin</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
<span>self</span><span>.</span><span>end</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
<span>self</span><span>.</span><span>onSnippingCompleted</span> <span>=</span> <span>None</span>
<span>def</span> <span>start</span><span>(</span><span>self</span><span>):</span>
<span>SnippingWidget</span><span>.</span><span>is_snipping</span> <span>=</span> <span>True</span>
<span>self</span><span>.</span><span>setWindowOpacity</span><span>(</span><span>0.3</span><span>)</span>
<span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>setOverrideCursor</span><span>(</span><span>QtGui</span><span>.</span><span>QCursor</span><span>(</span><span>QtCore</span><span>.</span><span>Qt</span><span>.</span><span>CrossCursor</span><span>))</span>
<span>self</span><span>.</span><span>show</span><span>()</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>cv2</span>
<span>from</span> <span>PIL</span> <span>import</span> <span>ImageGrab</span>
<span>from</span> <span>PySide2</span> <span>import</span> <span>QtWidgets</span><span>,</span> <span>QtCore</span><span>,</span> <span>QtGui</span>
<span>from</span> <span>PySide2.QtCore</span> <span>import</span> <span>Qt</span>

<span>class</span> <span>SnippingWidget</span><span>(</span><span>QtWidgets</span><span>.</span><span>QWidget</span><span>):</span>
    <span>is_snipping</span> <span>=</span> <span>False</span>

    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>,</span> <span>parent</span><span>=</span><span>None</span><span>,</span> <span>app</span><span>=</span><span>None</span><span>):</span>
        <span>super</span><span>(</span><span>SnippingWidget</span><span>,</span> <span>self</span><span>).</span><span>__init__</span><span>()</span>
        <span>self</span><span>.</span><span>parent</span> <span>=</span> <span>parent</span>
        <span>self</span><span>.</span><span>setWindowFlags</span><span>(</span><span>Qt</span><span>.</span><span>WindowStaysOnTopHint</span><span>)</span>

        <span>self</span><span>.</span><span>screen</span> <span>=</span> <span>app</span><span>.</span><span>primaryScreen</span><span>()</span>
        <span>self</span><span>.</span><span>setGeometry</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>width</span><span>(),</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>height</span><span>())</span>
        <span>self</span><span>.</span><span>begin</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
        <span>self</span><span>.</span><span>end</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
        <span>self</span><span>.</span><span>onSnippingCompleted</span> <span>=</span> <span>None</span>

    <span>def</span> <span>start</span><span>(</span><span>self</span><span>):</span>
        <span>SnippingWidget</span><span>.</span><span>is_snipping</span> <span>=</span> <span>True</span>
        <span>self</span><span>.</span><span>setWindowOpacity</span><span>(</span><span>0.3</span><span>)</span>
        <span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>setOverrideCursor</span><span>(</span><span>QtGui</span><span>.</span><span>QCursor</span><span>(</span><span>QtCore</span><span>.</span><span>Qt</span><span>.</span><span>CrossCursor</span><span>))</span>
        <span>self</span><span>.</span><span>show</span><span>()</span>
import numpy as np import cv2 from PIL import ImageGrab from PySide2 import QtWidgets, QtCore, QtGui from PySide2.QtCore import Qt class SnippingWidget(QtWidgets.QWidget): is_snipping = False def __init__(self, parent=None, app=None): super(SnippingWidget, self).__init__() self.parent = parent self.setWindowFlags(Qt.WindowStaysOnTopHint) self.screen = app.primaryScreen() self.setGeometry(0, 0, self.screen.size().width(), self.screen.size().height()) self.begin = QtCore.QPoint() self.end = QtCore.QPoint() self.onSnippingCompleted = None def start(self): SnippingWidget.is_snipping = True self.setWindowOpacity(0.3) QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) self.show()

Enter fullscreen mode Exit fullscreen mode

The size of the widget should be the same as the screen resolution, which can be obtained from the primaryScreen() function.

Next, we handle the mouse events:

<span>def</span> <span>mousePressEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
<span>self</span><span>.</span><span>begin</span> <span>=</span> <span>event</span><span>.</span><span>pos</span><span>()</span>
<span>self</span><span>.</span><span>end</span> <span>=</span> <span>self</span><span>.</span><span>begin</span>
<span>self</span><span>.</span><span>update</span><span>()</span>
<span>def</span> <span>mouseMoveEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
<span>self</span><span>.</span><span>end</span> <span>=</span> <span>event</span><span>.</span><span>pos</span><span>()</span>
<span>self</span><span>.</span><span>update</span><span>()</span>
<span>def</span> <span>mouseReleaseEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
<span>SnippingWidget</span><span>.</span><span>is_snipping</span> <span>=</span> <span>False</span>
<span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>restoreOverrideCursor</span><span>()</span>
<span>x1</span> <span>=</span> <span>min</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>x</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>x</span><span>())</span>
<span>y1</span> <span>=</span> <span>min</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>y</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>y</span><span>())</span>
<span>x2</span> <span>=</span> <span>max</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>x</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>x</span><span>())</span>
<span>y2</span> <span>=</span> <span>max</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>y</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>y</span><span>())</span>
<span>self</span><span>.</span><span>repaint</span><span>()</span>
<span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>processEvents</span><span>()</span>
<span>self</span><span>.</span><span>close</span><span>()</span>
<span>def</span> <span>mousePressEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
    <span>self</span><span>.</span><span>begin</span> <span>=</span> <span>event</span><span>.</span><span>pos</span><span>()</span>
    <span>self</span><span>.</span><span>end</span> <span>=</span> <span>self</span><span>.</span><span>begin</span>
    <span>self</span><span>.</span><span>update</span><span>()</span>

<span>def</span> <span>mouseMoveEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
    <span>self</span><span>.</span><span>end</span> <span>=</span> <span>event</span><span>.</span><span>pos</span><span>()</span>
    <span>self</span><span>.</span><span>update</span><span>()</span>

<span>def</span> <span>mouseReleaseEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
    <span>SnippingWidget</span><span>.</span><span>is_snipping</span> <span>=</span> <span>False</span>
    <span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>restoreOverrideCursor</span><span>()</span>
    <span>x1</span> <span>=</span> <span>min</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>x</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>x</span><span>())</span>
    <span>y1</span> <span>=</span> <span>min</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>y</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>y</span><span>())</span>
    <span>x2</span> <span>=</span> <span>max</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>x</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>x</span><span>())</span>
    <span>y2</span> <span>=</span> <span>max</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>.</span><span>y</span><span>(),</span> <span>self</span><span>.</span><span>end</span><span>.</span><span>y</span><span>())</span>

    <span>self</span><span>.</span><span>repaint</span><span>()</span>
    <span>QtWidgets</span><span>.</span><span>QApplication</span><span>.</span><span>processEvents</span><span>()</span>
    <span>self</span><span>.</span><span>close</span><span>()</span>
def mousePressEvent(self, event): self.begin = event.pos() self.end = self.begin self.update() def mouseMoveEvent(self, event): self.end = event.pos() self.update() def mouseReleaseEvent(self, event): SnippingWidget.is_snipping = False QtWidgets.QApplication.restoreOverrideCursor() x1 = min(self.begin.x(), self.end.x()) y1 = min(self.begin.y(), self.end.y()) x2 = max(self.begin.x(), self.end.x()) y2 = max(self.begin.y(), self.end.y()) self.repaint() QtWidgets.QApplication.processEvents() self.close()

Enter fullscreen mode Exit fullscreen mode

While the mouse is moving, we draw a rectangle to indicate the selected area in paintEvent() function:

<span>def</span> <span>paintEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
<span>if</span> <span>SnippingWidget</span><span>.</span><span>is_snipping</span><span>:</span>
<span>brush_color</span> <span>=</span> <span>(</span><span>128</span><span>,</span> <span>128</span><span>,</span> <span>255</span><span>,</span> <span>100</span><span>)</span>
<span>lw</span> <span>=</span> <span>3</span>
<span>opacity</span> <span>=</span> <span>0.3</span>
<span>else</span><span>:</span>
<span>self</span><span>.</span><span>begin</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
<span>self</span><span>.</span><span>end</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
<span>brush_color</span> <span>=</span> <span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>)</span>
<span>lw</span> <span>=</span> <span>0</span>
<span>opacity</span> <span>=</span> <span>0</span>
<span>self</span><span>.</span><span>setWindowOpacity</span><span>(</span><span>opacity</span><span>)</span>
<span>qp</span> <span>=</span> <span>QtGui</span><span>.</span><span>QPainter</span><span>(</span><span>self</span><span>)</span>
<span>qp</span><span>.</span><span>setPen</span><span>(</span><span>QtGui</span><span>.</span><span>QPen</span><span>(</span><span>QtGui</span><span>.</span><span>QColor</span><span>(</span><span>'black'</span><span>),</span> <span>lw</span><span>))</span>
<span>qp</span><span>.</span><span>setBrush</span><span>(</span><span>QtGui</span><span>.</span><span>QColor</span><span>(</span><span>*</span><span>brush_color</span><span>))</span>
<span>rect</span> <span>=</span> <span>QtCore</span><span>.</span><span>QRectF</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>,</span> <span>self</span><span>.</span><span>end</span><span>)</span>
<span>qp</span><span>.</span><span>drawRect</span><span>(</span><span>rect</span><span>)</span>
<span>def</span> <span>paintEvent</span><span>(</span><span>self</span><span>,</span> <span>event</span><span>):</span>
    <span>if</span> <span>SnippingWidget</span><span>.</span><span>is_snipping</span><span>:</span>
        <span>brush_color</span> <span>=</span> <span>(</span><span>128</span><span>,</span> <span>128</span><span>,</span> <span>255</span><span>,</span> <span>100</span><span>)</span>
        <span>lw</span> <span>=</span> <span>3</span>
        <span>opacity</span> <span>=</span> <span>0.3</span>
    <span>else</span><span>:</span>
        <span>self</span><span>.</span><span>begin</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
        <span>self</span><span>.</span><span>end</span> <span>=</span> <span>QtCore</span><span>.</span><span>QPoint</span><span>()</span>
        <span>brush_color</span> <span>=</span> <span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>,</span> <span>0</span><span>)</span>
        <span>lw</span> <span>=</span> <span>0</span>
        <span>opacity</span> <span>=</span> <span>0</span>

    <span>self</span><span>.</span><span>setWindowOpacity</span><span>(</span><span>opacity</span><span>)</span>
    <span>qp</span> <span>=</span> <span>QtGui</span><span>.</span><span>QPainter</span><span>(</span><span>self</span><span>)</span>
    <span>qp</span><span>.</span><span>setPen</span><span>(</span><span>QtGui</span><span>.</span><span>QPen</span><span>(</span><span>QtGui</span><span>.</span><span>QColor</span><span>(</span><span>'black'</span><span>),</span> <span>lw</span><span>))</span>
    <span>qp</span><span>.</span><span>setBrush</span><span>(</span><span>QtGui</span><span>.</span><span>QColor</span><span>(</span><span>*</span><span>brush_color</span><span>))</span>
    <span>rect</span> <span>=</span> <span>QtCore</span><span>.</span><span>QRectF</span><span>(</span><span>self</span><span>.</span><span>begin</span><span>,</span> <span>self</span><span>.</span><span>end</span><span>)</span>
    <span>qp</span><span>.</span><span>drawRect</span><span>(</span><span>rect</span><span>)</span>
def paintEvent(self, event): if SnippingWidget.is_snipping: brush_color = (128, 128, 255, 100) lw = 3 opacity = 0.3 else: self.begin = QtCore.QPoint() self.end = QtCore.QPoint() brush_color = (0, 0, 0, 0) lw = 0 opacity = 0 self.setWindowOpacity(opacity) qp = QtGui.QPainter(self) qp.setPen(QtGui.QPen(QtGui.QColor('black'), lw)) qp.setBrush(QtGui.QColor(*brush_color)) rect = QtCore.QRectF(self.begin, self.end) qp.drawRect(rect)

Enter fullscreen mode Exit fullscreen mode

Take screen images

PIL is the Python library for capturing images from the screen. After releasing the mouse, we take the screenshot of the selected area based on the coordinates of the rectangle.

<span>img</span> <span>=</span> <span>ImageGrab</span><span>.</span><span>grab</span><span>(</span><span>bbox</span><span>=</span><span>(</span><span>x1</span><span>,</span> <span>y1</span><span>,</span> <span>x2</span><span>,</span> <span>y2</span><span>))</span>
<span>try</span><span>:</span>
<span>img</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>np</span><span>.</span><span>array</span><span>(</span><span>img</span><span>),</span> <span>cv2</span><span>.</span><span>COLOR_RGB2BGR</span><span>)</span>
<span>except</span><span>:</span>
<span>img</span> <span>=</span> <span>None</span>
<span>img</span> <span>=</span> <span>ImageGrab</span><span>.</span><span>grab</span><span>(</span><span>bbox</span><span>=</span><span>(</span><span>x1</span><span>,</span> <span>y1</span><span>,</span> <span>x2</span><span>,</span> <span>y2</span><span>))</span>

<span>try</span><span>:</span>
    <span>img</span> <span>=</span> <span>cv2</span><span>.</span><span>cvtColor</span><span>(</span><span>np</span><span>.</span><span>array</span><span>(</span><span>img</span><span>),</span> <span>cv2</span><span>.</span><span>COLOR_RGB2BGR</span><span>)</span>
<span>except</span><span>:</span>
    <span>img</span> <span>=</span> <span>None</span>
img = ImageGrab.grab(bbox=(x1, y1, x2, y2)) try: img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) except: img = None

Enter fullscreen mode Exit fullscreen mode

Taking full screen image is easy:

<span>img</span> <span>=</span> <span>ImageGrab</span><span>.</span><span>grab</span><span>(</span><span>bbox</span><span>=</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>width</span><span>(),</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>height</span><span>()))</span>
<span>img</span> <span>=</span> <span>ImageGrab</span><span>.</span><span>grab</span><span>(</span><span>bbox</span><span>=</span><span>(</span><span>0</span><span>,</span> <span>0</span><span>,</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>width</span><span>(),</span> <span>self</span><span>.</span><span>screen</span><span>.</span><span>size</span><span>().</span><span>height</span><span>()))</span>
img = ImageGrab.grab(bbox=(0, 0, self.screen.size().width(), self.screen.size().height()))

Enter fullscreen mode Exit fullscreen mode

Hide and show the application window

Once the snipping widget is ready, we can call it in button click event. Note: to avoid obstructing the screen, the application window should be minimized before launching the snipping widget and restored after the snipping is completed:

<span>def</span> <span>onSnippingCompleted</span><span>(</span><span>self</span><span>,</span> <span>frame</span><span>):</span>
<span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMaximized</span><span>)</span>
<span>if</span> <span>frame</span> <span>is</span> <span>None</span><span>:</span>
<span>return</span>
<span>frame</span><span>,</span> <span>self</span><span>.</span><span>_results</span> <span>=</span> <span>self</span><span>.</span><span>_barcodeManager</span><span>.</span><span>decode_frame</span><span>(</span><span>frame</span><span>)</span>
<span>self</span><span>.</span><span>showResults</span><span>(</span><span>frame</span><span>,</span> <span>self</span><span>.</span><span>_results</span><span>)</span>
<span>def</span> <span>snipArea</span><span>(</span><span>self</span><span>):</span>
<span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMinimized</span><span>)</span>
<span>self</span><span>.</span><span>snippingWidget</span><span>.</span><span>start</span><span>()</span>
<span>def</span> <span>snipFull</span><span>(</span><span>self</span><span>):</span>
<span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMinimized</span><span>)</span>
<span>self</span><span>.</span><span>snippingWidget</span><span>.</span><span>fullscreen</span><span>()</span>
<span>def</span> <span>onSnippingCompleted</span><span>(</span><span>self</span><span>,</span> <span>frame</span><span>):</span>
    <span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMaximized</span><span>)</span>
    <span>if</span> <span>frame</span> <span>is</span> <span>None</span><span>:</span>
        <span>return</span> 

    <span>frame</span><span>,</span> <span>self</span><span>.</span><span>_results</span> <span>=</span> <span>self</span><span>.</span><span>_barcodeManager</span><span>.</span><span>decode_frame</span><span>(</span><span>frame</span><span>)</span>
    <span>self</span><span>.</span><span>showResults</span><span>(</span><span>frame</span><span>,</span> <span>self</span><span>.</span><span>_results</span><span>)</span>

<span>def</span> <span>snipArea</span><span>(</span><span>self</span><span>):</span>
    <span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMinimized</span><span>)</span>
    <span>self</span><span>.</span><span>snippingWidget</span><span>.</span><span>start</span><span>()</span>    

<span>def</span> <span>snipFull</span><span>(</span><span>self</span><span>):</span>
    <span>self</span><span>.</span><span>setWindowState</span><span>(</span><span>Qt</span><span>.</span><span>WindowMinimized</span><span>)</span>
    <span>self</span><span>.</span><span>snippingWidget</span><span>.</span><span>fullscreen</span><span>()</span> 
def onSnippingCompleted(self, frame): self.setWindowState(Qt.WindowMaximized) if frame is None: return frame, self._results = self._barcodeManager.decode_frame(frame) self.showResults(frame, self._results) def snipArea(self): self.setWindowState(Qt.WindowMinimized) self.snippingWidget.start() def snipFull(self): self.setWindowState(Qt.WindowMinimized) self.snippingWidget.fullscreen()

Enter fullscreen mode Exit fullscreen mode

Test the screen QR reader

  1. Run the barcode recognition program:

    python3 app_advanced.py
    python3 app_advanced.py
    python3 app_advanced.py
  2. Search Google for QR code.

  3. Click the Select Area button to scan QR code (one or multiple) returned by search engine.

    You can also make a full screen barcode recognition by one click.

Source Code

https://github.com/yushulx/python-gui-barcode-reader

原文链接:How to Scan QR Code from Desktop Screen in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
The worst sort of indolence is being given a choice, yet taking no initiative to change.
我们人生中最大的懒惰,就是当我们明知自己拥有作出选择的能力,却不去主动改变而是放任它的生活态度
评论 抢沙发

请登录后发表评论

    暂无评论内容