ter*_*ghn 4 python grid tkinter pack
我是python的新手所以请原谅我的Noob-ness.我试图在我的应用程序窗口底部创建一个状态栏,但似乎每次我在同一个文件中一起使用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()
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏!谢谢!
Bry*_*ley 11
你不能同时使用pack,并grid在具有相同的主部件.第一个将调整小部件的大小.另一个将看到变化,并调整一切以适应它自己的约束.第一个将看到这些更改并再次调整所有内容以适应其约束.另一个将无限制地看到变化等等.他们将陷入争夺至高无上的永恒斗争中.
虽然技术上可行,如果你真的,真的知道你正在做什么,无论出于各种意图和目的,你都不能将它们混合在同一个容器中.您可以在应用程序中将它们全部混合在一起,但对于给定的容器(通常是一个框架),您只能使用一个来管理容器的直接内容.
一种非常常见的技术是将GUI分成几部分.在您的情况下,您有一个底部状态栏和一个顶部"主"区域.因此,将状态栏打包在底部并创建一个框架,在其上方为GUI的主要部分打包.然后,其他一切都将主框架作为其父框架,并在该框架内,您可以使用网格或包或任何您想要的.
是啊,没错。在下面的示例中,我将程序分为 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)
Run Code Online (Sandbox Code Playgroud)