尝试在 tkinter 中创建一个 9 x 9 的数独网格,但每九个方格的填充 (padx) 已关闭。我的代码有什么问题?

Trying to create a 9 x 9 sudoku grid in tkinter, but the padding (padx) for every ninth square is off. What is the problem in my code?

这是到目前为止的所有代码。我尝试更改填充值、if 语句条件,并为 (row + 1) % 3 == 0 和 (col + 1) % 3 == 0 添加 elif 条件。他们似乎都没有积极的对网格的影响。

import tkinter


mW = tkinter.Tk()

mW.title('Sudoku')
mW.geometry('800x640')


def grid_layout(grid_dim):
    entries = []
    for i in range(0, grid_dim ** 2):
        row = i // grid_dim
        col = i % grid_dim
        entries.append(tkinter.Entry(mW, width=3, highlightthickness=1, highlightbackground='#000000'))
        if (row + 1) % 3 == 0:
            entries[i].grid(row=row, column=col, pady=(0, 10), ipadx=5, ipady=5)
        elif (col + 1) % 3 == 0:
            entries[i].grid(row=row, column=col, padx=(0, 10), ipadx=5, ipady=5)
        else:
            entries[i].grid(row=row, column=col, ipadx=5, ipady=5)


grid_layout(9)

mW.mainloop()

The sudoku grid

问题是因为最后一个单元格同时需要 pady=(0, 10)padx=(0, 10) - 所以使用两个 if 而不是 if/elif

if (row+1) % 3 == 0:
    entries[i].grid(row=row, column=col, pady=(0, 10), ipadx=5, ipady=5)

if (col+1) % 3 == 0:
    entries[i].grid(row=row, column=col, padx=(0, 10), ipadx=5, ipady=5)
else:
    entries[i].grid(row=row, column=col, ipadx=5, ipady=5)

您也可以稍作不同 - 使用 (0,0) 作为所有单元格的默认值

pad_y = (0, 0)
pad_x = (0, 0)

if (row+1) % 3 == 0:
    pad_y = (0, 10)

if (col+1) % 3 == 0:
    pad_x = (0, 10)

entries[i].grid(row=row, column=col, ipadx=5, ipady=5, padx=pad_x, pady=pad_y)

编辑:

我会写得有点不同——使用两个 for 循环。并跳过行中最后一个单元格和列中最后一个单元格的 pad

import tkinter as tk

# --- functions ---

def grid_layout(mW, grid_dim):
    entries = []
    
    for row in range(grid_dim):
        for col in range(grid_dim):
        
            entry = tk.Entry(mW, width=3, highlightthickness=1, highlightbackground='#000000')
            
            pad_y = (0, 0)
            pad_x = (0, 0)
            
            if (row+1) % 3 == 0 and (row+1) < grid_dim: # skip for last row
                pad_y = (0, 10)
                
            if (col+1) % 3 == 0 and (col+1) < grid_dim: # skip for last column
                pad_x = (0, 10)

            entry.grid(row=row, column=col, ipadx=5, ipady=5, padx=pad_x, pady=pad_y)

            entries.append(entry)

    return entries
    
# --- main ---

mW = tk.Tk()
mW.title('Sudoku')

entries = grid_layout(mW, 9)  # send result 

mW.mainloop()

然后我将 mW 发送到函数,然后 entriesreturn 中发回,因为

Explicit is better than implicit.

参见:Zen of Python

您需要添加:

  • 第 3 列和第 6 列左填充
  • 第 3 行和第 6 行的顶部填充
def grid_layout(grid_dim):
    entries = []
    for i in range(grid_dim*grid_dim):
        row = i // grid_dim
        col = i % grid_dim
        entries.append(tkinter.Entry(mW, width=3, highlightthickness=1, highlightbackground='#000000'))
        padx = (10, 0) if col in (3, 6) else None
        pady = (10, 0) if row in (3, 6) else None
        entries[i].grid(row=row, column=col, padx=padx, pady=pady, ipadx=5, ipady=5)