Не могу понять геометрию упаковки и сетки с помощью tkinter - PullRequest
0 голосов
/ 22 января 2019

Привет, я не совсем понял, как furas заставил работать приведенный ниже код. Почему он не получил сообщение об ошибке grid и pack в том же корне, когда добавил ящик? В функции addbox он устанавливает фрейм в корень, который уже является пакетом, и даже использует пакет внутри функции, а затем использует сетку.

Может кто-нибудь объяснить мне, как работает эта "магия"?

ссылка на его ответ: Создание новых полей ввода с помощью кнопки Tkinter

    from Tkinter import *

#------------------------------------

def addBox():
    print "ADD"

    frame = Frame(root)
    frame.pack()

    Label(frame, text='From').grid(row=0, column=0)

    ent1 = Entry(frame)
    ent1.grid(row=1, column=0)

    Label(frame, text='To').grid(row=0, column=1)

    ent2 = Entry(frame)
    ent2.grid(row=1, column=1)

    all_entries.append( (ent1, ent2) )

#------------------------------------

def showEntries():

    for number, (ent1, ent2) in enumerate(all_entries):
        print number, ent1.get(), ent2.get()

#------------------------------------

all_entries = []

root = Tk()

showButton = Button(root, text='Show all text', command=showEntries)
showButton.pack()

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Нет магии, она просто работает как задумано.Код использует pack в корневом окне и grid внутри фрейма.Каждый виджет, который действует как контейнер для других виджетов, может использовать либо grid, либо pack.Вы просто не можете одновременно использовать grid и pack для виджетов, имеющих один и тот же мастер.

0 голосов
/ 23 января 2019

Я думаю, что вы упускаете из виду то, что на самом деле есть пакет и сетка.Рассмотрим такой код:

import tkinter as tk

root = tk.Tk()

myFrame = tk.Frame(root)

myFrame.pack()

myButton1 = tk.Button(myFrame, text='This is button 1')
myButton2 = tk.Button(myFrame, text='This is button 2')

myButton1.grid(row=0, column=0)
myButton2.grid(row=1, column=0)

root.mainloop()

Создав root, мы создадим новое окно.В этом окне мы разместим все остальное.Затем мы создаем myFrame.Обратите внимание, что фактическая «вещь» (в более адекватных терминах - виджет) создается в строке myFrame = tk.Frame(root).Обратите внимание, что мы должны указать, куда мы собираемся поместить этот виджет в скобки, и мы написали, что он будет корневым - наше главное окно.Пустой кадр, вероятно, не лучший пример, так как вы не можете видеть, как он размещается (если только вы не используете хотя бы несколько спецификаций), но все же.Мы создали его, но не поместили в наш пользовательский интерфейс.Мы используем .pack(), чтобы разместить его.Теперь вы обращаетесь к виджетам как к пакетам или сеткам.Это не правда, хотя.Пакет и сетка - это просто набор правил, по которым виджеты размещаются внутри какого-то окна.Из-за этого, если вы хотите добавить что-то большее к root в нашем случае, вам придется снова использовать .pack().Зачем?Если вы дадите два набора правил размещения вещей на экране для вашего компьютера - они, скорее всего, будут конфликтовать друг с другом.Однако, если мы опустимся еще на один уровень и теперь захотим поместить что-то в наш myFrame, мы снова сможем выбрать, какой набор правил использовать.Это потому, что не имеет значения, где наши frame окажутся внутри root, теперь мы просто хотим указать, где наши кнопки 1 и 2 окажутся в кадре.Поэтому мы можем снова использовать .pack() или переключиться на .grid().

. Итак, .pack(), .grid() и .place() - это наборы правил размещения виджетов внутри других виджетов.В более общих чертах это правила о том, как размещать ящики в других ящиках.В одних коробках, в которых мы размещаем другие, может быть только один набор правил.

Надеюсь, этот пример поможет.

0 голосов
/ 22 января 2019

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

Просто выкладываю это, чтобы другие тоже могли его найти. Учебное пособие по tkinter от beazley

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...