DFS schrieb am Mittwoch, 22. September 2021 um 09:41:42 UTC+2: > 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> > > ===================================================================== Thank you,
I'll try to use this QTextEdit, to see if I'm able to manage my needs. Regards Mohsen -- https://mail.python.org/mailman/listinfo/python-list