6

我是 python 新手,所以请原谅我的菜鸟。我试图在我的应用程序窗口底部创建一个状态栏,但似乎每次我在同一个文件中同时使用 pack() 和 grid() 方法时,主应用程序窗口都不会打开。当我注释掉 statusbar.pack(side = BOTTOM, fill = X) 的行时,我的应用程序窗口打开得很好,但是如果我把它留在里面,并且如果我注释掉任何使用 grid 方法的行带有状态栏的窗口打开。似乎我只能使用 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() 

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

4

3 回答 3

13

您不能同时使用packgrid具有相同主控的小部件。第一个将调整小部件的大小。另一个将看到更改,并调整所有内容以适应它自己的约束。第一个将看到这些更改并再次调整所有内容以适应约束。另一个会看到这些变化,以此类推。他们将陷入争夺霸权的永恒斗争中。

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

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

于 2013-06-24T02:54:02.117 回答
5

是的,没错。在下面的例子中,我把我的程序分成了 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)
于 2017-05-08T06:01:14.300 回答
0

对于单个小部件,答案是否定的:您不能在一个小部件中pack()同时使用两者。grid()但是您可以将两者用于不同的小部件,即使它们都在同一个小部件中。例如:

my_canvas=tk.Canvas(window1,width=540,height=420,bd=0)
my_canvas.create_image(270,210,image=bg,anchor="center")
my_canvas.pack(fill="both",expand=True)            
originallbl = tk.Label(my_canvas, text="Original", width=15).grid(row=1,column=1)
original = tk.Entry(my_canvas, width=15).grid(row=1,column=2)

我用于pack()设置画布,用于grid()在同一画布中设置标签、按钮等

于 2021-10-06T07:43:50.157 回答