python3 tkinter网格和包,内联打包语法&优雅

时间:2015-02-17 05:30:00

标签: python python-3.x syntax tkinter pack

将一个框架“排成一列”与“将它”变为一个变量并将其包装在下一行之间有什么区别?

所以我看到了如何同时进行网格和打包(see here),但在玩完之后,我遇到了一些奇怪的事情。如果您从以下位置更改第16/17行:

f5 = Frame(mainF, bg = "yellow", height=100, width = 60)
f5.pack(side=BOTTOM,fill=NONE)

为:

f5 = Frame(mainF, bg = "yellow", height=100, width = 60).pack(side=BOTTOM,fill=NONE)

在代码的最后,按钮被放入一个框架内的一个包内的网格中,在一个框架内的一个框架内......我曾经没有错误的代码现在给出错误:

TclError: cannot use geometry manager grid inside .164287488 which already has slaves managed by pack

如何?什 - 嗯?为什么呢?

我的完整代码:

from tkinter import Tk, Frame, Label, Entry, LEFT, TOP, YES, NONE, BOTH, RIGHT, BOTTOM,SE, Button,W,E,N,S

root = Tk()

mainF = Frame(root, bg = "green", height=100, width = 1060).pack(side=BOTTOM,fill=NONE)

f4 = Frame(mainF, bg = "blue", width = 300).pack(side=BOTTOM,fill=BOTH)

f = Frame(f4, bg = "orange", width = 500, height = 500).pack(side=LEFT, expand = 1)

f3 = Frame(f, bg = "red", width = 500)
f3.pack(side=LEFT, expand = 1, pady = 10, padx = 50)

f2 = Frame(f4, bg = "black", height=100, width = 100).pack(side=LEFT, fill = BOTH)

f5 = Frame(mainF, bg = "yellow", height=100, width = 60)
f5.pack(side=BOTTOM,fill=NONE)
#f7 = Frame(f5, bg = "green", height=100, width = 160).pack(side=BOTTOM,fill=BOTH)
#f6 = Frame(f7, bg = "green", height=100, width = 360).pack(side=BOTTOM,fill=BOTH)

b = Button(f2, text = "test")
b.pack()

Button(f3, text = "1").grid(row=0, column=0)
Button(f3, text = "2").grid(row=1, column=1)
Button(f3, text = "3").grid(row=2, column=2)

Button(f5, text = "1").grid(row=0, column=0)
Button(f5, text = "2").grid(row=1, column=1)
Button(f5, text = "3").grid(row=2, column=2)

root.mainloop()

我在Windows 7 64中的python 3.4.1 64内的anaconda 64内的ipython中使用Spyder2 ...

  

梦中的许多梦想太不稳定了!

1 个答案:

答案 0 :(得分:1)

在第二个例子中:

f5 = Frame(mainF, bg = "yellow", height=100, width = 60).pack(side=BOTTOM,fill=NONE)

f5为无。在第一个例子中情况并非如此:

f5 = Frame(mainF, bg = "yellow", height=100, width = 60)
f5.pack(side=BOTTOM,fill=NONE)

简而言之,不推荐使用“在线”方法。对于python中tkinter的新用户来说,这是最常见的错误和原因之一。

None的原因非常简单:pack()grid()返回无。

在完整的代码示例中,mainFf4ff2都是无。因此,对于exmaple,您认为您将mainF框架的引用作为主文件传递给f4,但事实上您正在传递None