如何在tkinter数独项目中使用Separator或其他工具添加网格分隔线?
数独宫格分隔线实现方案
方案1:差异化设置Entry边距(最简实现,无需额外组件)
不需要新增Separator组件,直接通过调整不同位置Entry的边距实现视觉分隔效果,修改你Input类的grid参数即可,同时顺带修正原代码全局变量v导致所有输入框值联动的问题:
class Input(): def __init__(self, row, column): # 每个Entry单独持有StringVar,避免值联动 self.v = StringVar() self.row = row self.column = column # 计算边距:每3行的下边缘、每3列的右边缘加大边距模拟分隔线 pady = (1, 4) if (row + 1) % 3 == 0 and row != 8 else 1 padx = (1, 4) if (column + 1) % 3 == 0 and column != 8 else 1 self.entry = Entry(root, textvariable=self.v, width=2, justify="center", insertofftime=0, font="Century 20").grid( row=row+1, column=column+1, ipadx=13, ipady=13, padx=padx, pady=pady) def value_def(self, deflt): self.v.set(deflt)
你可以根据需要调整边距数值(上面示例用的4),配合窗口背景色就能实现清晰的宫格分隔效果。
方案2:使用ttk.Separator组件实现实体分隔线
你之前布局失败是因为没有预留分隔线的行/列位置,按以下步骤调整即可:
- 调整Entry的行、列号计算规则,为分隔线预留位置:每3行Entry插入1行放水平分隔线,每3列Entry插入1列放垂直分隔线
- 对应位置放置Separator组件,设置正确的跨行列属性:
from tkinter import ttk class Input(): def __init__(self, row, column): self.v = StringVar() self.row = row self.column = column # 计算实际grid行号:3、6行Entry后各加1行分隔线 grid_row = row + 1 + (1 if row >=3 else 0) + (1 if row >=6 else 0) # 计算实际grid列号:3、6列Entry后各加1列分隔线 grid_col = column + 1 + (1 if column >=3 else 0) + (1 if column >=6 else 0) self.entry = Entry(root, textvariable=self.v, width=2, justify="center", insertofftime=0, font="Century 20").grid( row=grid_row, column=grid_col, ipadx=13, ipady=13, padx=1, pady=1) def value_def(self, deflt): self.v.set(deflt) # 所有Entry生成完成后,添加分隔线 # 水平分隔线:放在第4、第8行位置(对应插入的预留行),跨所有列 for sep_row in [4, 8]: ttk.Separator(root, orient='horizontal').grid(row=sep_row, column=1, columnspan=11, sticky='ew', pady=2) # 垂直分隔线:放在第4、第8列位置(对应插入的预留列),跨所有行 for sep_col in [4, 8]: ttk.Separator(root, orient='vertical').grid(column=sep_col, row=1, rowspan=11, sticky='ns', padx=2)
内容的提问来源于stack exchange,提问作者ThomasFR
相关产品推荐
相关产品推荐

