Как да направя прост съветник с помощта на grid() в Tkinter?

Прости ми. Аз съм нов в Tkinter и имам само просто/скромно разбиране за python. Общата ми цел е да направя програма, подобна на съветника, където потребителят въвежда непрекъснато нарастващи специфики, докато програмата върви (като определени рамки се появяват в зависимост от определени входове). Опитвам се просто да накарам основната идея на съветника да работи и срещам някои проблеми. Ето моят код (коментирах неща, които други източници предполагат, че са на прав път, но се провалиха за мен):

from Tkinter import *
root = Tk()
#root.minsize(300,300) ?
#root.geometry("300x300") ?

def next():
    move(+1)

def prev():
    move(-1)

def exit_program():
    root.destroy()

page1 = Frame(root, width=300, height=300)
page1.grid()
#page1.grid(row=0,column=0, sticky="nsew") ?
#page1.grid_rowconfigure(0, weight=1) ?
#page1.grid_columnconfigure(0, weight=1) ?
p1_label = Label(page1, text='This is page 1 of the wizard.').grid(column=1, row=0)
p1_quit = Button(page1, text="Quit", command=exit_program).grid(column=1, row=2)
p1_next = Button(page1, text="Next", command=next).grid(column=2, row=2)

page2 = Frame(root)
p2_label = Label(page2, text='This is page 2 of the wizard.').grid(column=1, row=0)
p2_prev = Button(page2, text="Prev", command=prev).grid(column=1, row=2)
p2_next = Button(page2, text="Next", command=next).grid(column=2, row=2)

page3 = Frame(root)
p3_label = Label(page3, text='This is page 3 of the wizard.').grid(column=1, row=0)
p3_prev = Button(page3, text="Prev", command=prev).grid(column=1, row=2)
p3_quit = Button(page3, text="Quit", command=exit_program).grid(column=2, row=2)

pages = [page1, page2, page3]
current = page1
def move(dirn):
    global current
    idx = pages.index(current) + dirn
    if not 0 <= idx < len(pages):
        return
   current.grid_forget()
   current = pages[idx]
   current.grid()

root.mainloop()

Имам няколко въпроса:

  • Защо първият (и всички) кадър(и) се свиват до размера на джаджите вътре, въпреки че съм задал ширината и височината да бъдат определено количество? Погледнах онлайн и очевидно grid_propagate(False) изключва повторното оразмеряване, но едновременно силно НЕ се препоръчва и направо неуспешно (да, прави прозореца размерите, които искам, но самата "решетка" все още е в горната част -наляво). Не трябва ли да мога да посоча размерите на рамка и мрежата да се подравни с тези размери (т.е. организацията на мрежата се запазва, само не площта)? Този проблем свързан ли е с процеса на съветника? Бих предпочел не също, но вероятно все още мога да напиша програмата в един прозорец.
  • Защо решетката изглежда 2x2? Не трябва ли да е 3x3, защото нулевият запис е валиден? Поставих бутон (p1_next) на позиция (2x2). Дали защото нищо не е в колоната 0, grid() го премахва и измества всичко наляво?
  • Това ли е най-добрият подход за това, което се опитвам да постигна? Страхувам се, че знам само абсолютните основи на ООП и бих предпочел да избягвам, ако е възможно (също така тази програма, макар и голяма за мен, ще се окаже незначителна според съвременните стандарти за разработка на софтуер).

От опита си да научавам неща, имам предположение, че проблемът не е бързо решение и че имам нужда от голяма промяна на парадигмата, за да разбера това. Така или иначе, всяка помощ ще бъде много ценена

Съжалявам, ако това е дубликат. И благодаря!


person J. Davis    schedule 09.10.2015    source източник


Отговори (1)


Защо първият (и всички) кадър(и) се свиват до размера на джаджите вътре, въпреки че съм задал ширината и височината да бъдат определено количество? ... Не трябва ли да мога да посоча размерите на рамката и мрежата да се подравни с тези размери

Просто така е проектиран да работи tkinter: контейнерите се свиват, за да поберат съдържанието им. В 99% от случаите това е правилното решение. Както забелязахте, можете да изключите разпространението на геометрията, но това има странични ефекти и изисква да вършите работа, която обикновено се обработва по-добре от tkinter. Ако наистина настоявате рамката да е с определен размер, изключването на разпространението обикновено е начинът, по който го правите.

Ако вашият конкретен случай е по-разумно да принудите основния прозорец да бъде с определен размер, вместо да принудите рамките да бъдат с определен размер. След това рамките ще растат (или ще се свиват), за да паснат на главния прозорец. Можете да направите това, като използвате метода geometry на основния прозорец.

Защо решетката изглежда 2x2? Не трябва ли да е 3x3, защото нулевият запис е валиден? Поставих бутон (p1_next) на позиция (2x2). Дали защото нищо не е в колоната 0, grid() го премахва и измества всичко наляво?

Ако в дадена колона няма нищо, тази колона ще има ширина по подразбиране нула (освен ако не е част от унифицирана група или има минимален размер и т.н.). Същото важи и за редовете - празните редове по подразбиране имат височина нула.

Това ли е най-добрият подход за това, което се опитвам да постигна?

Това е трудно да се отговори. Вероятно няма "най-добър" начин.

Може да искате да разгледате този отговор на свързан въпрос, който показва начин за превключване между набор от рамки чрез подреждане тях и след това издигане на текущия до върха на стека.

person Bryan Oakley    schedule 09.10.2015