Вопрос о выравнивании кадров в Tkinter внутри сетки, пытаясь достичь идентичных результатов с помощью .grid () и .pack () в кадре - PullRequest
0 голосов
/ 22 ноября 2018

Впервые на python и получаю много полезной информации с этого сайта.

Я создаю диаграмму с помощью .grid (), а затем снова с кадрами в .pack () в качестве упражнения и проверяю,Я могу получить идентичные результаты.

Функция showchart_grid () работает и производит в значительной степени то, что я хочу создать.Это диаграмма, в которой нижний ряд содержит 14 квадратов, а верхний ряд представляет собой метки для этих квадратов, а иногда метки столбцов охватывают 2 квадрата.Вы можете увидеть это в атрибуте columnspan =.Есть несколько странных пробелов между метками столбцов в строке 0, но кроме этого все они выстраиваются в линию.

def showchart_grid():
    root = Tk()

    # create 14 squares on the grid

    for i in range(1, 15):

        spot = Label(root, text='square', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.grid(row=1, column=i)

    # create the column labels on top of the grid in row one

    label0 = Label(root, text=0, bg="DodgerBlue", fg="white", height=2, width=10, borderwidth=1, relief='solid')
    label0.grid(row=0, column=1)
    label1 = Label(root, text=1, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label1.grid(row=0, column=2, columnspan=2)
    label2 = Label(root, text=2, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label2.grid(row=0, column=4, columnspan=2)
    label4 = Label(root, text=4, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label4.grid(row=0, column=6, columnspan=2)
    label6 = Label(root, text=6, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label6.grid(row=0, column=8, columnspan=2)
    label8 = Label(root, text=8, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label8.grid(row=0, column=10, columnspan=2)
    label11 = Label(root, text=11, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label11.grid(row=0, column=12, columnspan=2)
    label15 = Label(root, text=15, bg="CadetBlue1", height=2, width=10, borderwidth=1, relief='solid')
    label15.grid(row=0, column=14)

    mainloop()

Теперь, когда я пытаюсь сделать то же самое, создав рамку для меток столбцов ирамка для квадратов, позиции больше не совпадают, даже если размеры одинаковы.Как будто метки столбцов не заполняют весь кадр.Я испортил заполнение = и расширение =, но не смог понять, как именно.Примечание: в этой версии решена странная проблема с пробелами между метками столбцов.

def showchart_framespack_test():
    root = Tk()

    # define my frames

    pointsframe = Frame(root, width=140)
    pointsframe.pack(side=TOP)

    playerframe = Frame(root, width=140)
    playerframe.pack(side=TOP)

    # create bottom row of squares with pack

    for i in range(1, 15):

        spot = Label(playerframe, text='empty', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.pack(side=LEFT)

    # create top row of labels with pack

    label0 = Label(pointsframe, text=0, bg="DodgerBlue", fg="white", height=2, width=10, borderwidth=1, relief='solid')
    label0.pack(side=LEFT)
    label1 = Label(pointsframe, text=1, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label1.pack(side=LEFT)
    label2 = Label(pointsframe, text=2, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label2.pack(side=LEFT)
    label4 = Label(pointsframe, text=4, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label4.pack(side=LEFT)
    label6 = Label(pointsframe, text=6, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label6.pack(side=LEFT)
    label8 = Label(pointsframe, text=8, bg='CadetBlue1', height=2, width=20, borderwidth=1, relief='solid')
    label8.pack(side=LEFT)
    label11 = Label(pointsframe, text=11, bg='DodgerBlue', height=2, width=20, borderwidth=1, relief='solid')
    label11.pack(side=LEFT)
    label15 = Label(pointsframe, text=15, bg="CadetBlue1", height=2, width=10, borderwidth=1, relief='solid')
    label15.pack(side=LEFT)



mainloop()

Как мне улучшить программирование, чтобы получить желаемый результат с 14 квадратами внизу, с метками сверху, чтокаждая линия идеально совпадает с границами 14 квадратов в нижнем ряду?

PS это функции, потому что они будут принимать входные данные и корректировать график как таковой, но сейчас я просто оставил его как «пустой» всепуть через.

1 Ответ

0 голосов
/ 22 ноября 2018

По сути, сетка представляет собой двумерную компоновку.Если два элемента назначены одному и тому же столбцу, они располагаются вертикально.

С другой стороны, pack - это одномерный макет, в котором элементы располагаются относительно других.

Во втором примеревы создаете два горизонтальных списка элементов, которые не зависят друг от друга.Оба имеют одинаковое количество элементов, но элементы не будут выстроены в ряд, потому что «столбцы» рассчитываются индивидуально для обоих кадров.

Если вы можете жить без ячеек, охватывающих несколько столбцов, вы можете выстроить столбцы в ряд, создав15 фреймов, каждый из которых содержит метку и квадрат, и поместите их рядом друг с другом, используя пакет.

Кроме этого, ваш сценарий использования действительно предназначен для макета сетки.Я использую сетку для всего, потому что, на мой взгляд, она более гибкая и ее легче рассуждать.

Отвечает ли это на ваш вопрос?

РЕДАКТИРОВАТЬ:

Вы можете избавиться от пробелов, если вы используете опцию sticky="WE" вместо того, чтобы вручную указывать ширину каждой метки.Это заставит это простираться налево и направо.Модифицированный код:

from tkinter import *

def showchart_grid():
    root = Tk()

    # create 14 squares on the grid

    for i in range(1, 15):

        spot = Label(root, text='square', bg='white', height=5, width=10, borderwidth=1, relief='solid', justify=CENTER)
        spot.grid(row=1, column=i)

    # create the column labels on top of the grid in row one

    label0 = Label(root, text=0, bg="DodgerBlue", fg="white", height=2, borderwidth=1, relief='solid')
    label0.grid(row=0, column=1, sticky="WE")
    label1 = Label(root, text=1, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label1.grid(row=0, column=2, sticky="WE", columnspan=2)
    label2 = Label(root, text=2, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label2.grid(row=0, column=4, sticky="WE", columnspan=2)
    label4 = Label(root, text=4, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label4.grid(row=0, column=6, sticky="WE", columnspan=2)
    label6 = Label(root, text=6, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label6.grid(row=0, column=8, sticky="WE", columnspan=2)
    label8 = Label(root, text=8, bg='CadetBlue1', height=2, borderwidth=1, relief='solid')
    label8.grid(row=0, column=10, sticky="WE", columnspan=2)
    label11 = Label(root, text=11, bg='DodgerBlue', height=2, borderwidth=1, relief='solid')
    label11.grid(row=0, column=12, sticky="WE", columnspan=2)
    label15 = Label(root, text=15, bg="CadetBlue1", height=2, borderwidth=1, relief='solid')
    label15.grid(row=0, column=14, sticky="WE")

    mainloop()


if __name__ == '__main__':
    showchart_grid()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...