简体   繁体   English

尝试在 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?

This is all the code so far.这是到目前为止的所有代码。 I have tried changing the padding values, the if statement conditions, and adding an elif condition for when both (row + 1) % 3 == 0 and (col + 1) % 3 == 0. They all seemed to have no positive effect on the grid.我尝试更改填充值、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数独网格

Problem is because last cell need both pady=(0, 10) and padx=(0, 10) - so use two if instead of if/elif问题是因为最后一个单元格同时需要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)

You can also do it little different - using (0,0) as default value for all cells您也可以做一些不同的事情 - 使用(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)

EDIT:编辑:

I would write it little different - using two for -loops.我会写它有点不同 - 使用两个for循环。 And skiping pad for last cell in row and last cell in column.并跳过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()

在此处输入图像描述

And I send mW to function and entries send back in return because然后我将mW发送到 function 并return entries ,因为

Explicit is better than implicit.

See: Zen of Python见: Python之禅

You need to add:您需要添加:

  • left padding on column 3 and 6第 3 列和第 6 列的左填充
  • top padding on row 3 and 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM