[英]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()
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:您需要添加:
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.