python pack()和grid()方法一起使用

我新来的Python,所以请原谅我的Noob-ness。 我试图在我的应用程序窗口底部创build一个状态栏,但似乎每次我在同一个文件中使用pack()和grid()方法,主应用程序窗口不会打开。 当我注释掉statusbar.pack(side = BOTTOM,fill = X)这一行时,我的应用程序窗口打开的很好,但是如果我把它放在它里面,并且如果我注释掉任何使用grid方法的行窗口打开状态栏。 看来我只能使用pack()或grid(),但不能同时使用。 我知道我应该能够使用这两种方法。 有什么build议么? 代码如下:

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() 

任何帮助表示赞赏! 谢谢!

您不能在同一个包含小部件中使用packgrid 。 第一个将调整小部件的大小。 另一个会看到变化,并调整一切,以适应自己的限制。 第一个将看到这些变化,再次调整一切,以适应约束。 另一个会看到变化,等等。 他们将陷于永恒的争夺霸权之中。

虽然技术上可行的是,如果你真的知道自己在做什么,为了所有的目的和目的,你不能将它们混合在同一个容器中 。 您可以将所有需要的内容混合到应用程序中,但是对于给定的容器(通常是一个框架),只能使用一个来pipe理容器的直接内容。

一个非常常见的技术是把你的GUI分成几块。 在你的情况下,你有一个底部的状态栏,顶部的“主”区域。 因此,将状态栏打包在底部,并在GUI的主要部分创build一个包装在其上方的框架。 然后,其他所有东西都以主框架作为其父框架,在框架内可以使用网格或包装或任何你想要的东西。

是啊,没错。 在下面的例子中,我已经把我的程序分成了两个框架。 frame1迎合菜单/工具栏,并使用pack()方法,其中frame2用于制作login页面凭证并使用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)