Границы с некоторых сторон


Я кодирую клиента для варианта крестики-нолики. Изменения логики игры не имеют отношения к этому вопросу

Я пытаюсь показать сетку крестиков-ноликов с хэштегом, как показано ниже.

пример сетки

Я изначально думал использовать границы на кнопках или рамки, содержащие кнопки, но другие вопросы нашли трудности (и пару сложных обходных путей) при добавлении границ к определенным сторонам.

Я бы предпочел не прибегать к объекту Canvas для рисования игра, так как это кажется - как и другие упомянутые-как дешевый обходной путь в ущерб удобочитаемости.

Как я могу добавить эти строки между рамками / столбцами сетки / метками / кнопками?

2 2

2 ответа:

Это можно сделать, поместив белые рамки внутри черных и используя аргументы padx и pady из grid:

import tkinter as tk 

root = tk.Tk()

frame = tk.Frame(root, bg='black')
frames = []
for i in range(3):
    frames.append([])
    for j in range(3):
        frames[i].append(tk.Frame(frame, bg='white', width=50, height=50))
        frames[i][j].grid(row=i, column=j, 
                          padx=((j != 0) * 2,  (j != 2) * 2),
                          pady=((i != 0) * 2,  (i != 2) * 2))

frame.pack()
root.mainloop()

padx и pady может либо взять одно число, чтобы получить симметричный результат, либо кортеж значений:padx=(<left>, <right>) и pady=(<top>, <bottom>).

скриншот

Как насчет чего-то вроде этого:

# I use python 2
import Tkinter as tk 
# For Python 3 use import tkinter as tk 

def create_grid(event=None):
    w = c.winfo_width() # Get current width of canvas
    h = c.winfo_height() # Get current height of canvas
    c.delete('grid_line') # Will only remove the grid_line

    # Creates all vertical lines at intevals of 100 except for first and last
    for i in range(100, w - 100, 100):
        c.create_line([(i, 0), (i, h)], tag='grid_line')

    # Creates all horizontal lines at intevals of 100 except for first and last
    for i in range(100, h - 100, 100):
        c.create_line([(0, i), (w, i)], tag='grid_line')

root = tk.Tk()

c = tk.Canvas(root, height=300, width=300, bg='white')
c.pack(fill=tk.NONE, expand=True)

c.bind('<Configure>', create_grid)

root.mainloop()

Я взял Этот ответ и немного подправил его, чтобы края не были показаны