【问题标题】:How to change just one side border width of a ttk.Entry?如何仅更改 ttk.Entry 的一侧边框宽度?
【发布时间】:2021-04-14 09:39:26
【问题描述】:

我正在尝试使用 tkinter 网格和 ttk 条目显示数独布局(也许,我没有使用正确的方法来实现它)。我想知道 ttk 条目的样式选项是否有任何方法可以更改一侧的边框。我已经应用了这个功能:

def grid_layout(parent):
    
    s = ttk.Style()
    s.configure('border.TEntry',borderwidth=3)
    
    for row in range(1,10):
        for column in range(1,10):
            entry = None
            if column % 3 == 0 or row % 3 == 0:
                entry = ttk.Entry(parent, width=3,justify='center'
                                  ,style='border.TEntry')
            else:
                entry = ttk.Entry(parent,width=3,justify='center')
                
            entry.grid(column= column, row = row)

这会产生以下视图:

我只需要更改列 3-4、6-7 和行 3-4 和 6-7 共享的边框宽度,作为典型的类似数独的布局。任何建议将不胜感激。

【问题讨论】:

  • 构建堆叠布局不是更好吗:九个 3x3 框内包含九个 3x3 条目?
  • 您能以成对的形式提供所需的盒子吗?如 (4,2) 用于第 4 行和第 2 列中的框。依此类推
  • 说实话,我试图实现边框样式。你的建议似乎很不错。此外,用于处理 3x3 框,分别。
  • @JuanVillaseca 我现在还添加了一个选项来访问这些值

标签: python-3.x tkinter tkinter-entry tkinter-layout ttkwidgets


【解决方案1】:

如我之前的评论中所述,我将使用堆叠布局,其中包含框架中的框和这些框中的条目。所以不需要特别的造型。访问ttk.Entries 中的值会得到一个包含tk.StringVar 对象的字典,键是大写字母'A'..'I' 结合数字'1'..'9',就像在电子表格应用程序中一样:

import tkinter as tk
from tkinter import ttk

mainWin = tk.Tk()
mainWin.title('Sudoku solver')

mainFrame = ttk.Frame(mainWin, borderwidth=10)
mainFrame.grid(column=1, row=1)

# access to entries (of type tk.StringVar)
values = {}

for box_col in range(3):
    for box_row in range(3):
        box = ttk.Frame(mainFrame, borderwidth=1, relief='sunken')
        box.grid(column=box_col+1, row=box_row+1)
        for cell_col in range(3):
            for cell_row in range(3):
                v = tk.StringVar()
                # build spreadsheet key from overall column and row
                col = 'ABCDEFGHI'[3*box_col+cell_col]
                row = '123456789'[3*box_row+cell_row]
                key = col+row
                values[key] = v
                entry = ttk.Entry(box, width=3, justify='center', textvariable=v)
                entry.grid(column=cell_col+1, row=cell_row+1)

# example for accessing the entries
values['A1'].set(1)
values['G3'].set(7)
values['E5'].set(int(values['A1'].get())+4)
values['I9'].set(int(values['E5'].get())+4)

mainWin.mainloop()

在 Windows 8.1 下,如下所示:

【讨论】:

  • 我想我会使用一个 numpy 数组来转储信息并检查数独的完整性。
  • @JuanVillaseca 也许这可能是有趣的:Adding validation to an Entry widget 这可能更容易保持所有 81 个数字的紧凑最新容器并以这种方式检查整个数独。 (迭代所有 StringVars 对我来说似乎很慢)
  • 也许this answer to "Interactively validating Entry widget content in tkinter" 更有帮助。验证还有一个好处是禁止所有导致值超出'1''2''3''4''5''6''7''8''9' 和 @ 的编辑987654338@.
  • 非常有用。不过,我想当用户点击一个单元格时,我会显示一个可点击的对话框。通过“检查数独的完整性”,我的意思是检查在同一个框、列和行中没有重复的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2022-01-25
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多