методы python pack () и grid () вместе

Я новичок в Python, так что, пожалуйста, простите меня за нубовство. Я пытаюсь создать строку состояния в нижней части окна моего приложения, но кажется, что каждый раз, когда я использую методы pack () и grid () вместе в одном файле, главное окно приложения не открывается. Когда я комментирую строку, в которой написано statusbar.pack (side = BOTTOM, fill = X), мое окно приложения открывается нормально, но если я оставлю его в нем, нет, а также, если я закомментирую любые строки, которые используют метод сетки откроется окно со строкой состояния. Похоже, я могу использовать только pack () или grid (), но не то и другое одновременно. Я знаю, что смогу использовать оба метода. Какие-либо предложения? Вот код:

from Tkinter import *
import tkMessageBox

def Quit():
 answer = tkMessageBox.askokcancel('Quit', 'Are you sure?')
 if answer:
    app.destroy()

app = Tk()
app.geometry('700x500+400+200')
app.title('Title')

label_1 = Label(text = "Enter number")
label_1.grid(row = 0, column = 0)
text_box1 = DoubleVar() 
input1 = Entry(app, textvariable = text_box1)
input1.grid(row = 0, column = 2)

statusbar = Label(app, text = "", bd = 1, relief = SUNKEN, anchor = W)
statusbar.pack(side = BOTTOM, fill = X)

startButton = Button(app, text = "Start", command = StoreValues).grid(row = 9, column = 2,  padx = 15, pady = 15)

app.mainloop() 

Любая помощь приветствуется! Спасибо!


person terence vaughn    schedule 24.06.2013    source источник
comment
Я не говорю, что это невозможно, но общий совет - выбрать один.   -  person Jared    schedule 24.06.2013
comment
Я использую только оба, потому что я не знаю, как разместить строку состояния в нижней части экрана, используя сетку, и я не знаю, как заполнить = X с помощью функции сетки.   -  person terence vaughn    schedule 24.06.2013
comment
@ Джаред: ваш комментарий вводит в заблуждение. Во всех смыслах и целях это невозможно.   -  person Bryan Oakley    schedule 24.06.2013
comment
Возможный дубликат Невозможно использовать пакет диспетчера геометрии внутри   -  person Stevoisiak    schedule 15.02.2018


Ответы (2)


Вы не можете использовать одновременно pack и grid для виджетов с одним и тем же мастером. Первый отрегулирует размер виджета. Другой увидит изменение и изменит размер всего в соответствии с собственными ограничениями. Первый увидит эти изменения и снова изменит размер всего, чтобы соответствовать своим ограничениям. Другой увидит изменения и так до бесконечности. Они застрянут в вечной борьбе за превосходство.

Хотя это технически возможно, если вы действительно действительно знаете, что делаете, для любых целей и целей вы не можете смешивать их в одном контейнере. Вы можете смешивать их все, что хотите, в своем приложении в целом, но для данного контейнера (обычно фрейма) вы можете использовать только один для управления непосредственным содержимым контейнера.

Очень распространенный прием - разделить ваш графический интерфейс на части. В вашем случае у вас есть нижняя строка состояния и верхняя «основная» область. Итак, упакуйте строку состояния внизу и создайте рамку, которую вы упаковываете над ней для основной части графического интерфейса. Затем все остальное имеет основной фрейм в качестве своего родителя, и внутри этого фрейма вы можете использовать сетку или пакет или что угодно.

person Bryan Oakley    schedule 24.06.2013
comment
Круто, я думаю, теперь я понял ... Итак, когда вы говорите пьесы, вы имеете в виду классы? - person terence vaughn; 24.06.2013
comment
@terencevaughn: штуки == классы? Не обязательно. Хотя вы, безусловно, можете использовать классы, я имел в виду, что вы должны разделить свой интерфейс на логические группы. Каждая группа может быть реализована как фрейм, содержащий другие виджеты. Каждой логической группой можно управлять отдельно. - person Bryan Oakley; 24.06.2013

Да, это верно. В следующем примере я разделил свою программу на 2 кадра. frame1 ориентирован на меню / панель инструментов и использует методы pack (), в которых frame2 используется для создания учетных данных страницы входа и использует методы grid ().

from tkinter import *

def donothing():
    print ('IT WORKED')
root=Tk()
root.title(string='LOGIN PAGE')

frame1=Frame(root)
frame1.pack(side=TOP,fill=X)

frame2=Frame(root)
frame2.pack(side=TOP, fill=X)

m=Menu(frame1)
root.config(menu=m)

submenu=Menu(m)
m.add_cascade(label='File',menu=submenu)
submenu.add_command(label='New File', command=donothing)
submenu.add_command(label='Open', command=donothing)
submenu.add_separator()
submenu.add_command(label='Exit', command=frame1.quit)


editmenu=Menu(m)
m.add_cascade(label='Edit', menu=editmenu)
editmenu.add_command(label='Cut',command=donothing)
editmenu.add_command(label='Copy',command=donothing)
editmenu.add_command(label='Paste',command=donothing)
editmenu.add_separator()
editmenu.add_command(label='Exit', command=frame1.quit)


# **** ToolBar *******

toolbar=Frame(frame1,bg='grey')
toolbar.pack(side=TOP,fill=X)
btn1=Button(toolbar, text='Print', command=donothing)
btn2=Button(toolbar, text='Paste', command=donothing)
btn3=Button(toolbar, text='Cut', command=donothing)
btn4=Button(toolbar, text='Copy', command=donothing)
btn1.pack(side=LEFT,padx=2)
btn2.pack(side=LEFT,padx=2)
btn3.pack(side=LEFT,padx=2)
btn4.pack(side=LEFT,padx=2)

# ***** LOGIN CREDENTIALS ******
label=Label(frame2,text='WELCOME TO MY PAGE',fg='red',bg='white')
label.grid(row=3,column=1)

label1=Label(frame2,text='Name')
label2=Label(frame2,text='Password')
label1.grid(row=4,column=0,sticky=E)
label2.grid(row=5,column=0,sticky=E)

entry1=Entry(frame2)
entry2=Entry(frame2)
entry1.grid(row=4,column=1)
entry2.grid(row=5,column=1)

chk=Checkbutton(frame2,text='KEEP ME LOGGED IN')
chk.grid(row=6,column=1)

btn=Button(frame2,text='SUBMIT')
btn.grid(row=7,column=1)




# **** StatusBar ******************

status= Label(root,text='Loading',bd=1,relief=SUNKEN,anchor=W)
status.pack(side=BOTTOM, fill=X)
person Ary    schedule 08.05.2017