嗨,我真的不太了解furas如何使以下代码起作用。当他添加一个盒子时,为什么他没有收到关于网格和打包的错误消息?在addbox函数中,他将框架设置为已经是pack的根,甚至使用函数内部的pack,然后使用网格。
有人可以向我解释一下这种“魔术”是如何工作的吗?
指向他的答案的链接: Creating new entry boxes with button Tkinter
from Tkinter import *
#------------------------------------
def addBox():
print "ADD"
frame = Frame(root)
frame.pack()
Label(frame, text='From').grid(row=0, column=0)
ent1 = Entry(frame)
ent1.grid(row=1, column=0)
Label(frame, text='To').grid(row=0, column=1)
ent2 = Entry(frame)
ent2.grid(row=1, column=1)
all_entries.append( (ent1, ent2) )
#------------------------------------
def showEntries():
for number, (ent1, ent2) in enumerate(all_entries):
print number, ent1.get(), ent2.get()
#------------------------------------
all_entries = []
root = Tk()
showButton = Button(root, text='Show all text', command=showEntries)
showButton.pack()
谢谢
答案 0 :(得分:1)
没有魔术,只是按设计工作。该代码在根窗口中使用pack
,并在框架内使用grid
。每个充当其他小部件容器的小部件都可以使用grid
或pack
。对于具有相同母版的小部件,您不能同时使用grid
和pack
。
答案 1 :(得分:0)
不是一个真正的答案,但我认为您会从该链接中获得帮助。 tkinter及其布局确实有点难以理解。 直到我迷迷糊糊地介绍了布局细节,直到最终了解其中的内容,我才明白如何处理它。
只要把它放在那里,其他人也可以找到。 tkinter tutorial by beazley
答案 2 :(得分:0)
我认为您错过了实际的包装和网格。考虑这样的代码:
import tkinter as tk
root = tk.Tk()
myFrame = tk.Frame(root)
myFrame.pack()
myButton1 = tk.Button(myFrame, text='This is button 1')
myButton2 = tk.Button(myFrame, text='This is button 2')
myButton1.grid(row=0, column=0)
myButton2.grid(row=1, column=0)
root.mainloop()
通过创建root
,我们创建了一个新窗口。在此窗口中,我们将放置其他所有内容。然后,我们创建myFrame
。注意,实际的“事物”(更恰当的用语是小部件)是在第myFrame = tk.Frame(root)
行中创建的。注意,我们必须指定要将此小部件放在方括号中的位置,并且我们已经写好它将成为根目录-我们的主窗口。空白框可能不是最好的示例,因为您看不到它的放置位置(除非您至少使用了更多规格,否则不会),但仍然如此。我们已经创建了它,但是没有将其放置在用户界面中。我们使用.pack()
来放置它。现在,您将小部件称为包或网格。但这不是事实。 Pack和grid只是一组规则,在其上将小部件放置在某种类型的窗口中。因此,在本例中,如果您想向root
添加更多内容,则必须再次使用.pack()
。为什么?如果您针对如何在计算机屏幕上放置东西给出两套规则-它们很可能会相互冲突。但是,如果我们再下一层,现在想在myFrame
中放置一些内容,则可以再次选择要使用的规则集。这是因为这无关紧要,我们的frame
将在root
内结束的位置,我们现在只想指定按钮1和2在框架内的终止位置。因此,我们可以再次使用.pack()
或切换到.grid()
。
总结:.pack()
,.grid()
和.place()
是关于如何将小部件放置在其他小部件内的规则集。概括地说,这些是关于如何将框放置在其他框中的规则。我们在其中布置其他盒子的一个盒子只能有一套规则。
我希望这个例子有帮助。