【问题标题】:How do you remove the padding between frames in a grid?如何删除网格中帧之间的填充?
【发布时间】:2021-04-28 15:47:30
【问题描述】:

我正在尝试使用 tkinter 制作一个简单的棋盘,但在每一行之间都有一些空白空间,即使在扩展时也没有使用。问题似乎来自配置列和行,但我需要它使大小保持不变。我该如何解决?这是我的代码:

from tkinter import *
import tkinter as tk

window = tk.Tk()

for i in range(8):
    window.columnconfigure(i, minsize=75)
    window.rowconfigure(i, minsize=75)
    for j in range(8):
        if i % 2 == 1 and j % 2 == 1:
            frame = tk.Frame (
                master=window,
                bg="white", 
                )
            frame.grid(row=i, column=j)
            label = tk.Label(master=frame, text="White sq", background="white", foreground="white")
            label.pack(padx=12, pady=15)
        elif i % 2 == 1 and j % 2 == 0:
            frame = tk.Frame (
                master=window,
                bg="black", 
                )
            frame.grid(row=i, column=j)
            label = tk.Label(master=frame, text="Black sq", background="black")
            label.pack(padx=12, pady=15)
        elif i % 2 == 0 and j % 2 == 1:
            frame = tk.Frame (
                master=window,
                bg="black", 
                )
            frame.grid(row=i, column=j)
            label = tk.Label(master=frame, text="Black sq", background="black")
            label.pack(padx=12, pady=15)
        else:
            frame = tk.Frame (
                master=window,
                bg="white", 
                )
            frame.grid(row=i, column=j)
            label = tk.Label(master=frame, text="White sq", background="white", foreground="white")
            label.pack(padx=12, pady=15)
        
            
            
        

window.mainloop()

【问题讨论】:

  • 您是否尝试将bg=0, highlightthickness=0 添加到tk.Frame(...)
  • @TheLizzard 你的意思是bd
  • @CoolCloud 你是对的。我的坏:D。
  • 我也会考虑使用一个填充了正方形的Canvas 小部件,例如here
  • 尝试在frame.grid(...) 中添加sticky="nsew"

标签: python-3.x tkinter


【解决方案1】:

正如@acw1668 所说,您可以通过将sticky="nswe" 参数传递给网格来解决问题。

另外,不要重复自己(DRY)。您已经多次复制粘贴几乎相同的内容。

这里是固定代码:

import tkinter as tk


root = tk.Tk()

fill_with_white = True

for row in range(8):
    root.rowconfigure(row, minsize=75)
    
    for column in range(8):
        bg = "white" if fill_with_white else "black"

        root.columnconfigure(column, minsize=75)
        frame = tk.Frame(root, bg=bg)
        frame.grid(row=row, column=column, sticky="news")
        label = tk.Label(frame, text=bg.capitalize(), bg=bg)
        label.pack()

        fill_with_white = not fill_with_white

    fill_with_white = not fill_with_white

root.mainloop()

【讨论】:

  • 没问题。您知道如果您只有 1 个变量,那么选择颜色会更容易。你想让我用我的建议编辑你的答案吗?
  • 我只使用了一个可以切换的变量,而不是 XOR。它简化了代码:D.
  • @TheLizzard,我明白了 :) 没想过这样的方法 :)
  • 几个月前我做了一个国际象棋引擎,这就是我使用的代码:D
  • bg = "white" if (row+column)&1 else "black"