簡體   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?

這是到目前為止的所有代碼。 我嘗試更改填充值、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()

數獨網格

問題是因為最后一個單元格同時需要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發送到 function 並return entries ,因為

Explicit is better than implicit.

見: 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM