pyside2 ,pyqt5 制作数独游戏

问题遇到的现象和发生背景

本人希望图形化展现数独求解过程。该程序内有一个数独以数组形式存放,GUI界面有81个按钮与之对应。点击按钮可以改变数组该位置的值,刷新表盘,使按钮上的文本改变为数字的值。但是运行结果很不理想。

问题相关代码,请勿粘贴截图
from PySide2.QtWidgets import *
from PySide2.QtUiTools import *
from PySide2.QtCore import *
from PySide2 import QtWidgets
from PySide2.QtGui import *
import sys
import os
import background
import inputnum


DELAY = 50  #刷新间隔
path = os.path.realpath(os.curdir)  # 获取当前目录的绝对路径

class Thread(QThread):  # 开线程,防卡死
    def __init__(self):
        super(Thread,self).__init__()

    def run(self):
        while w.running:
            w.refresh_num()  #刷新表盘,将数组的数字同步到按钮上
            app.processEvents()
            self.sleep(DELAY)

class MainWindow(QWidget):
    running = True  #程序是否运行
    index = int(0)  #存放数组地址
    nums = int(0)  #存放输入数据
    data = [[2, 0, 0, 0, 8, 0, 0, 1, 0],  #程序内数独表
                 [0, 4, 0, 1, 0, 0, 3, 0, 0],
                 [0, 0, 0, 0, 9, 0, 0, 0, 0],
                 [0, 0, 0, 7, 0, 0, 8, 4, 0],
                 [0, 9, 0, 0, 2, 1, 0, 0, 0],
                 [0, 0, 6, 0, 0, 0, 0, 0, 0],
                 [0, 3, 0, 0, 0, 0, 5, 8, 0],
                 [1, 0, 0, 8, 0, 0, 0, 0, 7],
                 [0, 2, 7, 0, 5, 3, 0, 0, 0]]

    def __init__(self):

        self.ui = QUiLoader().load(path+'/ui/untitled.ui')#ui文件,最好不改,做了很久


        self.ui.loadimg.clicked.connect(self.choice_photo)#选择导入的数独照片
        self.ui.a11.clicked.connect(self.giveindex)#选择填入的地址
        '''
        self.ui.a12.clicked.connect(self.giveindex(12))
        self.ui.a13.clicked.connect(self.giveindex(13))
        self.ui.a14.clicked.connect(self.giveindex(14))
        self.ui.a15.clicked.connect(self.giveindex(15))
        self.ui.a16.clicked.connect(self.giveindex(16))
        self.ui.a17.clicked.connect(self.giveindex(17))
        self.ui.a18.clicked.connect(self.giveindex(18))
        self.ui.a19.clicked.connect(self.giveindex(19))
        self.ui.a21.clicked.connect(self.giveindex(21))
        self.ui.a22.clicked.connect(self.giveindex(22))
        self.ui.a23.clicked.connect(self.giveindex(23))
        self.ui.a24.clicked.connect(self.giveindex(24))
        self.ui.a25.clicked.connect(self.giveindex(25))
        self.ui.a26.clicked.connect(self.giveindex(26))
        self.ui.a27.clicked.connect(self.giveindex(27))
        self.ui.a28.clicked.connect(self.giveindex(28))
        self.ui.a29.clicked.connect(self.giveindex(29))
        self.ui.a31.clicked.connect(self.giveindex(31))
        self.ui.a32.clicked.connect(self.giveindex(32))
        self.ui.a33.clicked.connect(self.giveindex(33))
        self.ui.a34.clicked.connect(self.giveindex(34))
        self.ui.a35.clicked.connect(self.giveindex(35))
        self.ui.a36.clicked.connect(self.giveindex(36))
        self.ui.a37.clicked.connect(self.giveindex(37))
        self.ui.a38.clicked.connect(self.giveindex(38))
        self.ui.a39.clicked.connect(self.giveindex(39))
        self.ui.a41.clicked.connect(self.giveindex(41))
        self.ui.a42.clicked.connect(self.giveindex(42))
        self.ui.a43.clicked.connect(self.giveindex(43))
        self.ui.a44.clicked.connect(self.giveindex(44))
        self.ui.a45.clicked.connect(self.giveindex(45))
        self.ui.a46.clicked.connect(self.giveindex(46))
        self.ui.a47.clicked.connect(self.giveindex(47))
        self.ui.a48.clicked.connect(self.giveindex(48))
        self.ui.a49.clicked.connect(self.giveindex(49))
        self.ui.a51.clicked.connect(self.giveindex(51))
        self.ui.a52.clicked.connect(self.giveindex(52))
        self.ui.a53.clicked.connect(self.giveindex(53))
        self.ui.a54.clicked.connect(self.giveindex(54))
        self.ui.a55.clicked.connect(self.giveindex(55))
        self.ui.a56.clicked.connect(self.giveindex(56))
        self.ui.a57.clicked.connect(self.giveindex(57))
        self.ui.a58.clicked.connect(self.giveindex(58))
        self.ui.a59.clicked.connect(self.giveindex(59))
        self.ui.a61.clicked.connect(self.giveindex(61))
        self.ui.a62.clicked.connect(self.giveindex(62))
        self.ui.a63.clicked.connect(self.giveindex(63))
        self.ui.a64.clicked.connect(self.giveindex(64))
        self.ui.a65.clicked.connect(self.giveindex(65))
        self.ui.a66.clicked.connect(self.giveindex(66))
        self.ui.a67.clicked.connect(self.giveindex(67))
        self.ui.a68.clicked.connect(self.giveindex(68))
        self.ui.a69.clicked.connect(self.giveindex(69))
        self.ui.a71.clicked.connect(self.giveindex(71))
        self.ui.a72.clicked.connect(self.giveindex(72))
        self.ui.a73.clicked.connect(self.giveindex(73))
        self.ui.a74.clicked.connect(self.giveindex(74))
        self.ui.a75.clicked.connect(self.giveindex(75))
        self.ui.a76.clicked.connect(self.giveindex(76))
        self.ui.a77.clicked.connect(self.giveindex(77))
        self.ui.a78.clicked.connect(self.giveindex(78))
        self.ui.a79.clicked.connect(self.giveindex(79))
        self.ui.a81.clicked.connect(self.giveindex(81))
        self.ui.a82.clicked.connect(self.giveindex(82))
        self.ui.a83.clicked.connect(self.giveindex(83))
        self.ui.a84.clicked.connect(self.giveindex(84))
        self.ui.a85.clicked.connect(self.giveindex(85))
        self.ui.a86.clicked.connect(self.giveindex(86))
        self.ui.a87.clicked.connect(self.giveindex(87))
        self.ui.a88.clicked.connect(self.giveindex(88))
        self.ui.a89.clicked.connect(self.giveindex(89))
        self.ui.a91.clicked.connect(self.giveindex(91))
        self.ui.a92.clicked.connect(self.giveindex(92))
        self.ui.a93.clicked.connect(self.giveindex(93))
        self.ui.a94.clicked.connect(self.giveindex(94))
        self.ui.a95.clicked.connect(self.giveindex(95))
        self.ui.a96.clicked.connect(self.giveindex(96))
        self.ui.a97.clicked.connect(self.giveindex(97))
        self.ui.a98.clicked.connect(self.giveindex(98))
        self.ui.a99.clicked.connect(self.giveindex(99))
        '''
        self.ui.n1.clicked.connect(self.givenum)#选择填入的数字
        '''
        self.ui.n2.clicked.connect(self.givenum(2))
        self.ui.n3.clicked.connect(self.givenum(3))
        self.ui.n4.clicked.connect(self.givenum(4))
        self.ui.n5.clicked.connect(self.givenum(5))
        self.ui.n6.clicked.connect(self.givenum(6))
        self.ui.n7.clicked.connect(self.givenum(7))
        self.ui.n8.clicked.connect(self.givenum(8))
        self.ui.n9.clicked.connect(self.givenum(9))
        self.ui.clean.clicked.connect(self.givenum(0))
        '''
        self.ui.exit.clicked.connect(self.put_num)#确认填入的数字
        self.ui.loadimg_2.clicked.connect(self.analyze_photo)# 进行图片识别
        self.ui.slove.clicked.connect(self.solve)#开始解题,能看见运行过程
        self.ui.restart.clicked.connect(self.clean)#重置表盘,全部归0

    def giveindex(self,num=11):
        self.index = num
        print(self.index)

    def givenum(self,in_num=1):
        self.nums = in_num
        print(self.nums)

    def put_num(self):  # 将数字填入对应的地方
        if self.nums != 0 and self.index != 0:
            self.data[self.index // 10 - 1][self.index % 10 - 1] = self.nums  #放入二维数组
            self.index, self.nums = 0, 0
            self.refresh_num()

    def refresh_num(self): #刷新表盘,将数组的数字同步到按钮上
        self.ui.a11.setText(self.data[0][0])
        self.ui.a12.setText(self.data[0][1])
        self.ui.a13.setText(self.data[0][2])
        self.ui.a14.setText(self.data[0][3])
        self.ui.a15.setText(self.data[0][4])
        self.ui.a16.setText(self.data[0][5])
        self.ui.a17.setText(self.data[0][6])
        self.ui.a18.setText(self.data[0][7])
        self.ui.a19.setText(self.data[0][8])
        self.ui.a21.setText(self.data[1][0])
        self.ui.a22.setText(self.data[1][1])
        self.ui.a23.setText(self.data[1][2])
        self.ui.a24.setText(self.data[1][3])
        self.ui.a25.setText(self.data[1][4])
        self.ui.a26.setText(self.data[1][5])
        self.ui.a27.setText(self.data[1][6])
        self.ui.a28.setText(self.data[1][7])
        self.ui.a29.setText(self.data[1][8])
        self.ui.a31.setText(self.data[2][0])
        self.ui.a32.setText(self.data[2][1])
        self.ui.a33.setText(self.data[2][2])
        self.ui.a34.setText(self.data[2][3])
        self.ui.a35.setText(self.data[2][4])
        self.ui.a36.setText(self.data[2][5])
        self.ui.a37.setText(self.data[2][6])
        self.ui.a38.setText(self.data[2][7])
        self.ui.a39.setText(self.data[2][8])
        self.ui.a41.setText(self.data[3][0])
        self.ui.a42.setText(self.data[3][1])
        self.ui.a43.setText(self.data[3][2])
        self.ui.a44.setText(self.data[3][3])
        self.ui.a45.setText(self.data[3][4])
        self.ui.a46.setText(self.data[3][5])
        self.ui.a47.setText(self.data[3][6])
        self.ui.a48.setText(self.data[3][7])
        self.ui.a49.setText(self.data[3][8])
        self.ui.a51.setText(self.data[4][0])
        self.ui.a52.setText(self.data[4][1])
        self.ui.a53.setText(self.data[4][2])
        self.ui.a54.setText(self.data[4][3])
        self.ui.a55.setText(self.data[4][4])
        self.ui.a56.setText(self.data[4][5])
        self.ui.a57.setText(self.data[4][6])
        self.ui.a58.setText(self.data[4][7])
        self.ui.a59.setText(self.data[4][8])
        self.ui.a61.setText(self.data[5][0])
        self.ui.a62.setText(self.data[5][1])
        self.ui.a63.setText(self.data[5][2])
        self.ui.a64.setText(self.data[5][3])
        self.ui.a65.setText(self.data[5][4])
        self.ui.a66.setText(self.data[5][5])
        self.ui.a67.setText(self.data[5][6])
        self.ui.a68.setText(self.data[0][7])
        self.ui.a69.setText(self.data[5][8])
        self.ui.a71.setText(self.data[6][0])
        self.ui.a72.setText(self.data[6][1])
        self.ui.a73.setText(self.data[6][2])
        self.ui.a74.setText(self.data[6][3])
        self.ui.a75.setText(self.data[6][4])
        self.ui.a76.setText(self.data[6][5])
        self.ui.a77.setText(self.data[6][6])
        self.ui.a78.setText(self.data[6][7])
        self.ui.a79.setText(self.data[6][8])
        self.ui.a81.setText(self.data[7][0])
        self.ui.a82.setText(self.data[7][1])
        self.ui.a83.setText(self.data[7][2])
        self.ui.a84.setText(self.data[7][3])
        self.ui.a85.setText(self.data[7][4])
        self.ui.a86.setText(self.data[7][5])
        self.ui.a87.setText(self.data[7][6])
        self.ui.a88.setText(self.data[7][7])
        self.ui.a89.setText(self.data[7][8])
        self.ui.a91.setText(self.data[8][0])
        self.ui.a92.setText(self.data[8][1])
        self.ui.a93.setText(self.data[8][2])
        self.ui.a94.setText(self.data[8][3])
        self.ui.a95.setText(self.data[8][4])
        self.ui.a96.setText(self.data[8][5])
        self.ui.a97.setText(self.data[8][6])
        self.ui.a98.setText(self.data[8][7])
        self.ui.a99.setText(self.data[8][8])
        print(self.data)

    def choice_photo(self):# 选择照片目录
        from PySide2.QtWidgets import QFileDialog

        filePath, _ = QFileDialog.getOpenFileName(
            self.ui,  # 父窗口对象
            "选择你要上传的图片",  # 标题
            r"c:\\",  # 起始目录
            "图片类型 (*.png *.jpg *.bmp)"  # 选择类型过滤项,过滤内容在括号中
        )

    def analyze_photo(self):# 识别图像,导出数组
        pass

    def clean(self):#重置表盘,全部置0
        pass

    def solve(self):# 自动求解
        pass





if __name__ == '__main__':
    app = QApplication([])
    w = MainWindow()
    w.ui.show()
    app.exec_()

运行结果及报错内容

img

#点击按钮返回为
False
False
False
False
False
False
False
False
False
False

我的解答思路和尝试过的方法
我想要达到的结果

保证程序能顺利完成,并且在自动求解时能显示运行过程

有简单的数独思路没,需要看下代码跟思路是否一致

啥时需要,端午节帮你看看可以嘛

img


UI文件方便给下不,可以帮你调试修复下

不是的题主具体哪里问题,没有给出问题报错信息啊!

先说明下问题,,在运行程序时,监视里会先把所有按钮点一遍(去掉注释的话),然后在运行的时候点击按钮无反应(无任何输出)
解数独代码如下

import copy
# 输出board所有的答案
def sudoku(board):
    # 检查当前数字在盘面中是否成立
    # i是当前行,j是当前列,num是当前数字
    def checkBoard(i,j,num):
         for t in range(9):                          # 检查行
              if t!= j and board[i][t] == num:
                   return False
              if t!= i and board[t][j] == num:        # 检查列
                   return False
              for r in range(i-i%3, 3+i-i%3):             # 检查3*3区域
                  for s in range(j-j%3, 3+j-j%3):
                       if r!=i and s!=j and board[r][s] ==num:
                            return False
         return True
    #填满盘面中第index格到最后一个格
    def helper(index):
         if index == 81:                               #边界条件
              solution = copy.deepcopy(board)        #深度复制当前盘面,放到res列表里
              res.append(solution)
              return                                  #返回到上一次被调用的地方(第80个空格)
         i = index//9                                #当前行
         j = index%9                                 #当前列
         if board[i][j]==0:                          #如果当前格没有已知数字
              for num in range(1,10):                 #依次尝试1-9
                   board[i][j] = num
                   if checkBoard(i,j,num):
                       helper(index+1)                 #去往下一个空格
                   board[i][j] = 0                     #将空格重新变空
         else:                                   #如果当前格是盘面自带的数字
              helper(index+1)
    res = []
    helper(0)                                      #从第一个空格开始
    return res


data = [[2,0,0,0,8,0,0,1,0],
        [0,4,0,1,0,0,3,0,0],
        [0,0,0,0,9,0,0,0,0],
        [0,0,0,7,0,0,8,4,0],
        [0,9,0,0,2,1,0,0,0],
        [0,0,6,0,0,0,0,0,0],
        [0,3,0,0,0,0,5,8,0],
        [1,0,0,8,0,0,0,0,7],
        [0,2,7,0,5,3,0,0,0]]
result = sudoku(data)
for item in result[0]:
    print(item)

顺便上传下ui文件https://download.csdn.net/download/weixin_62018756/85526834