Free OCR package in Python and selecting appropriate widget for the GUI

DFS nospam at dfs.com
Wed Sep 22 03:41:31 EDT 2021


On 9/22/2021 1:54 AM, Mohsen Owzar wrote:
> DFS schrieb am Mittwoch, 22. September 2021 um 05:10:30 UTC+2:
>> On 9/21/2021 10:38 PM, Mohsen Owzar wrote:
>>> DFS schrieb am Dienstag, 21. September 2021 um 15:45:38 UTC+2:
>>>> On 9/21/2021 4:36 AM, Mohsen Owzar wrote:
>>>>> Hi Guys
>>>>> Long time ago I've written a program in Malab a GUI for solving Sudoku puzzles, which worked not so bad.
>>>>> Now I try to write this GUI with Python with PyQt5 or TKinter.
>>>>> First question is:
>>>>> Is there any free OCR software, packages or code in Python, which I can use to recognize the given digits and their positions in the puzzle square.
>>>>> Second:
>>>>> Because, I can not attach a picture to this post, I try to describe my picture of my GUI.
>>>> Draw your GUI in PyQt designer or other graphics tool, then upload a
>>>> screenshot of it to imgur, then post the link to the picture.
>>> Thanks, for your answer.
>>> But, what is "imgur"?
>>> I'm not so familiar with handling of pictures in this group.
>>> How can I call "imgur" or how can I get there?
>>>
>>> Regards
>>> Mohsen
>> www.imgur.com
>>
>> It's a website you can upload image files or screenshots to. Then you
>> can copy a link to your picture and post the link here.
> I have already posted the link, but I can not see it anywhere.
> Now, I post it again:
> https://imgur.com/a/Vh8P2TE
> I hope that you can see my two images.
> Regards
> Mohsen


Got it.

I haven't used tkinter.  In PyQt5 designer I think you should use one 
QTextEdit control for each square.


Each square with the small black font can be initially populated with

1  2  3
4  5  6
7  8  9



https://imgur.com/lTcEiML



some starter python code  (maybe save as sudoku.py)

=====================================================================
from PyQt5 import Qt, QtCore, QtGui, QtWidgets, uic
from PyQt5.Qt import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

#objects
app = QtWidgets.QApplication([])
frm  = uic.loadUi("sudoku.ui")


#grid = a collection of squares
grids = 1

#squares = number of squares per grid
squares = 9

#fill the squares with 1-9
def populateSquares():
	for i in range(grids,grids+1):
		for j in range(1,squares+1):
			widget = frm.findChild(QtWidgets.QTextEdit, "txt{}_{}".format(i,j))
			widget.setText("1  2  3  4  5  6  7  8  9")

#read data from squares
def readSquares():
	for i in range(grids,grids+1):
		for j in range(1,squares+1):
			print("txt%d_%d contains: %s" % 
(i,j,frm.findChild(QtWidgets.QTextEdit, 
"txt{}_{}".format(i,j)).toPlainText()))
	

#connect pushbuttons to code
frm.btnPopulate.clicked.connect(populateSquares)
frm.btnReadContents.clicked.connect(readSquares)

#show main form
frm.show()

#initiate application
app.exec()
=====================================================================





.ui file (ie save as sudoku.ui)
=====================================================================

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
  <class>MainWindow</class>
  <widget class="QMainWindow" name="MainWindow">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>325</width>
     <height>288</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>Sudoku</string>
   </property>
   <widget class="QWidget" name="centralwidget">
    <widget class="QTextEdit" name="txt1_1">
     <property name="geometry">
      <rect>
       <x>32</x>
       <y>22</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_2">
     <property name="geometry">
      <rect>
       <x>114</x>
       <y>22</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_3">
     <property name="geometry">
      <rect>
       <x>196</x>
       <y>22</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_4">
     <property name="geometry">
      <rect>
       <x>32</x>
       <y>86</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_5">
     <property name="geometry">
      <rect>
       <x>114</x>
       <y>86</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_6">
     <property name="geometry">
      <rect>
       <x>196</x>
       <y>86</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_7">
     <property name="geometry">
      <rect>
       <x>32</x>
       <y>150</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_8">
     <property name="geometry">
      <rect>
       <x>114</x>
       <y>150</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QPushButton" name="btnPopulate">
     <property name="geometry">
      <rect>
       <x>32</x>
       <y>228</y>
       <width>121</width>
       <height>35</height>
      </rect>
     </property>
     <property name="text">
      <string>Populate with numbers</string>
     </property>
    </widget>
    <widget class="QTextEdit" name="txt1_9">
     <property name="geometry">
      <rect>
       <x>196</x>
       <y>150</y>
       <width>83</width>
       <height>65</height>
      </rect>
     </property>
     <property name="font">
      <font>
       <family>Courier</family>
       <pointsize>12</pointsize>
       <weight>50</weight>
       <bold>false</bold>
      </font>
     </property>
     <property name="acceptDrops">
      <bool>false</bool>
     </property>
     <property name="styleSheet">
      <string notr="true">color: rgb(0, 0, 127);
background-color: rgb(255, 255, 127);</string>
     </property>
     <property name="frameShape">
      <enum>QFrame::StyledPanel</enum>
     </property>
     <property name="frameShadow">
      <enum>QFrame::Sunken</enum>
     </property>
     <property name="horizontalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="acceptRichText">
      <bool>true</bool>
     </property>
    </widget>
    <widget class="QPushButton" name="btnReadContents">
     <property name="geometry">
      <rect>
       <x>170</x>
       <y>228</y>
       <width>109</width>
       <height>35</height>
      </rect>
     </property>
     <property name="text">
      <string>Read contents</string>
     </property>
    </widget>
   </widget>
   <widget class="QStatusBar" name="statusbar"/>
  </widget>
  <resources/>
  <connections/>
</ui>

=====================================================================









More information about the Python-list mailing list