Mohsen Owzar schrieb am Donnerstag, 23. September 2021 um 08:53:15 UTC+2: > 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. Hi > > >>> 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
Hi DFS, I’ve copied your code and ran it. It is almost that what I wanted except the fact, the 9 digits are not behave as a 3x3 matrix. When I click on the button “Populate with numbers”, on my screen looks like below in each square: 1 2 3 4 5 6 7 8 9 I want to get the numbers in a matrix form as: 1 2 3 4 5 6 7 8 9 And they should be placed centered in each square. And when a digit is missing, let say 4, 5 doesn’t have to take its place , so that: 1 2 3 5 6 7 8 9 And when the real number / digit is found, it should be a big one digit in the center of the square. I don’t know how to bring these two different font sizes and digit placements under one hat. Do you have any idea? Regards Mohsen -- https://mail.python.org/mailman/listinfo/python-list