Отличия в pack () и grid () tkinter - PullRequest
0 голосов
/ 20 мая 2018

Добрый день.Изучение ткинтера с использованием Python 3.5.Для начала я добился некоторого успеха, используя pack () для фреймов в root (), а затем использовал grid () внутри упакованных фреймов.Тогда я решил использовать сетку, чтобы поместить Рамки в корень и сетку внутри этих рамок.По сути, получить некоторую информацию от пользователя - сделать что-то с информацией - какой-то триггер для сброса кадров - начать все сначала.Во время процесса destroy () в pack () кажется, что Frames добавлены в root, а в grid () они вставлены.Это правильно?Разница в примерах кода заключается в примере pack (), который я использую:

На другом замечании - я также столкнулся с проблемой типа записей ('<class 'tkinter.Entry Object'>) вместо tkinter.Entry -Я не смог воспроизвести это сегодня.Есть ли способ прочитать такое значение, как get () не работает?

Спасибо

i = root.slaves()
for child in i[1].winfo_children():

Однако в примере grid () мне нужно было использовать:

i = root.grid_slaves()
for child in i[0].winfo_children():

Минимальный рабочий пример с использованием pack ():

def new():
    showEntries()
    D_setup()
    all_entries['D'] = D

def D_setup():
    dx = len(D)
    # D Label
    labD = Label(frame_for_D, text='Place to Enter Value')
    labD.grid(row = dx * 2, column = 0)
    # D Entry
    entD = Entry(frame_for_D, width=50)
    entD.grid(row = dx * 2 + 1, column=0)
    entD.delete(0,END)
    entD.insert(END, s[dx])
    # Append the last Entry
    D.append(entD)
    return

def showEntries():

    if len(D) == 0:
        return



    for number, ent in all_entries.items():
        if str(type(ent)) == "<class 'tkinter.Entry'>":
            print(type(ent))
            print (number, ent.get())
        elif str(type(ent)) == "<class 'list'>":
            print (number, [x.get() for x in ent])
    if len(D) > 5:
        i = root.slaves()
        for child in i[1].winfo_children():
            child.destroy()
        D.clear()
        all_entries.clear()
        D.clear()
        print(all_entries)
        print(D)
        raise SystemExit
    return


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

all_entries = {}
D = []
root = Tk()
root.configure(background = 'green')
# -- Define all frames
frame_for_buttons = Frame(root,background='black')
frame_for_D = Frame(root,background='red')
# -- pack all frames
frame_for_buttons.pack()
frame_for_D.pack()
# -- root
newTButton = Button(frame_for_buttons, text='New\n\n' +
                                             'Enter',
                    activebackground='red',
                    activeforeground='black',
                    borderwidth=10, foreground='black',
                    background='yellow',
                    highlightthickness=20,padx=5,pady=5,
                    command=new)
newTButton.grid(row=0, column=0)

root.mainloop()  

Пример с использованием grid ():

def new():

    showEntries()
    D_setup()
    all_entries['D'] = D

def D_setup():
    dx = len(D)
    # D Label
    labD = Label(frame_for_D, text='Place to Enter Value')
    labD.grid(row = dx * 2, column = dx)
    # D Entry
    entD = Entry(frame_for_D, width=50)
    entD.grid(row = dx * 2 + 1, column=dx)
    entD.delete(0,END)
    entD.insert(END, s[dx])
    # Append the Entry
    D.append(entD)
    return

def showEntries():

    if len(D) == 0:
        return

    for number, ent in all_entries.items():
        if str(type(ent)) == "<class 'tkinter.Entry'>":
            print(type(ent))
            print (number, ent.get())
        elif str(type(ent)) == "<class 'list'>":
            print([type(x) for x in ent])
            print (number, [x.get() for x in ent])
    if len(D) > 5:
        #i = frame_for_D.grid_slaves()      .winfo_children()
        i = root.grid_slaves()
        for child in i[0].winfo_children():
            child.destroy()
        D.clear()
        all_entries.clear()
        D.clear()
        print(all_entries)
        print(D)
        raise SystemExit
    return


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

all_entries = {}
D = []
root = Tk()
root.configure(background = 'green')
# -- Define all frames
frame_for_buttons = Frame(root,background='black')
frame_for_D = Frame(root,background='red')
# -- Grid all frames
frame_for_buttons.grid(row = 0, column = 0)
frame_for_D.grid(row = 1, column = 0, pady = 10, padx = 10)
# root
newTButton = Button(frame_for_buttons, text='New\n\n' +
                                             'Enter',
                    activebackground='red',
                    activeforeground='black',
                    borderwidth=10, foreground='black',
                    background='yellow',
                    highlightthickness=20,padx=5,pady=5,
                    command=new)
newTButton.grid(row=0, column=0)

root.mainloop()

1 Ответ

0 голосов
/ 20 мая 2018

Во время процесса destroy () в pack () кажется, что Frames добавляются в root, а в grid () они вставляются.

Не совсем.В обоих случаях они добавляются в кадр в соответствии с их параметрами.В случае pack, вариант размещения по умолчанию (например, side) - разместить виджет сверху доступного пространства в родительском / главном блоке.

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

Лучшие практики требуют, чтобы вы всегда указывали, по крайней мере, параметр side с помощью pack, а параметр row и column с grid, чтобы никогда не возникало путаницы относительно того, гдеВиджет предназначен для размещения.

Я также столкнулся с проблемой, что записи имеют тип (') вместо tkinter.Entry

Этот вопрос не'не имеет никакого смысла.Объекты, созданные с помощью Entry, всегда будут иметь тип <class 'tkinter.Entry'>, а метод get всегда будет работать при использовании объекта этого типа.

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