Python Pygame数独:使空单元格可编辑

Python Pygame数独:使空单元格可编辑,python,numpy,pygame,Python,Numpy,Pygame,一些同事编写了一个数独生成器 生成器使用蛮力创建完全解决的解决方案 方法 数独存储在一个9x9 numpy数组中 然后,基于 难度级别,某些单元格设置为零 然后使用pygame绘制网格 最后,数组中的所有单元格都有一个值!=0填充到网格中 下面是代码的一部分,网格中填充了未删除的值 def placeNumbers(sudoku_array): font = pygame.font.Font(None, 36) for row in range(9): for col in rang

一些同事编写了一个数独生成器

  • 生成器使用蛮力创建完全解决的解决方案 方法
  • 数独存储在一个9x9 numpy数组中
  • 然后,基于 难度级别,某些单元格设置为零
  • 然后使用pygame绘制网格
  • 最后,数组中的所有单元格都有一个值!=0填充到网格中
下面是代码的一部分,网格中填充了未删除的值

def placeNumbers(sudoku_array):
font = pygame.font.Font(None, 36)
for row in range(9):
    for col in range(9):
        if sudoku_array[row, col] != 0:
            integer = font.render(str(sudoku_array[row, col]), 1, black)
            display.blit(integer, (15 + col * 45, 10 + row * 45))
            pygame.display.flip()
现在,我们希望使空单元格(包含零的单元格)可编辑,即将其转换为文本字段。我们真的不知道如何做到这一点;有什么想法吗

可能是这样的:

elif sudoku_array[row, col] == 0:
    #create editable text field
    #at every position where a zero occurs
下面是阵列的一个示例:

[[7 6 0 0 0 4 2 3 5]
 [0 4 8 0 3 5 0 7 6]
 [3 9 5 0 0 2 1 0 4]
 [1 2 0 5 0 0 3 6 7]
 [0 0 9 0 1 6 8 4 2]
 [6 0 3 4 2 0 0 9 1]
 [0 0 6 8 5 3 0 2 9]
 [8 0 2 0 6 9 4 1 0]
 [9 3 7 2 4 0 0 5 0]]
编辑:

我找到了一个部分有效的解决方案。使用pygame网站()中的forms.py,我成功地将一个文本框添加到空单元格中。但是,还有一些问题:

  • 我可以在文本框中写字。但如果我点击backspace,什么也不会发生(即,我不能删除数字)。一个数字(例如“2”或“3”)刚好写在“下面”的其他数字上
  • 我只能通过点击pygame窗口右上角的关闭按钮进入下一个文本字段
下面是代码的下一部分:

if sudoku_array[row,col] == 0:
    f = Form(False)
    f.add_object('input', Input(' ', ' ', position = 'absolute', top= row*45, left = col * 45, input_bg_color=(0,0,0,0)))
    r = f.run(display)

PyGame没有小部件,所以你必须自己做所有事情-绘制、处理按键等。顺便说一句:你不必在每次
blit
之后都翻转
blit
-只做一次
blit
Hello@furas,谢谢你的回答。我找到了部分解决方案并编辑了我的问题。也许你可以看一看——那太好了!:-)似乎您只能创建一个
表单
。也许你必须创建一个表单,并将所有输入(和其他元素)放在该表单中。PyGame的其他GUI元素-但没有开发很长时间-PyGame没有小部件,所以你必须自己做所有事情-绘制、处理键,顺便说一句:你不必在每次
blit
后都翻转
flip
-毕竟只翻转一次
blit
Hello@furas,谢谢你的回答。我找到了部分解决方案并编辑了我的问题。也许你可以看一看——那太好了!:-)似乎您只能创建一个
表单
。也许你必须创建一个表单,并将所有输入(和其他元素)放在该表单中。PyGame的其他GUI元素-但很久没有开发-