尝试在 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
发送到函数,然后 entries
在 return
中发回,因为
Explicit is better than implicit.
您需要添加:
- 第 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)
这是到目前为止的所有代码。我尝试更改填充值、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
发送到函数,然后 entries
在 return
中发回,因为
Explicit is better than implicit.
您需要添加:
- 第 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)