python3 tkinter网格和打包,内联打包语法&优雅 [英] python3 tkinter grid and pack, inline packing syntax & elegance
问题描述
在线"打包框架与将其放入变量并将其打包到下一行之间有什么区别?
What's the difference between packing a frame "in line" versus ='ing it to a variable and .pack'ing it on the next line?
所以我看到了如何同时进行网格和打包(见这里),但是在玩弄它之后,我遇到了一些奇怪的事情.如果您将第 16/17 行更改为:
So I saw how to do grid and pack at the same time (see here), but after playing around with it, I ran into something weird. If you change line 16/17 from:
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)
在代码的末尾,按钮被放入一个框架内的一个框架内的一个包内的网格中......我曾经没有错误的代码现在给出了错误:
At the end of the code where the buttons get put into the grid within a pack within a frame within a frame within a dream... My once error-free code now gives the error:
TclError: cannot use geometry manager grid inside .164287488 which already has slaves managed by pack
怎么样?呵呵?为什么?
How? Wha-huh? Why?
我的完整代码在这里:
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...
I'm using Spyder2 within ipython within anaconda 64 within python 3.4.1 64 within Windows 7 64...
梦中那么多梦太不稳定了!
That many dreams within dreams is too unstable!
推荐答案
在第二个例子中:
f5 = Frame(mainF, bg = "yellow", height=100, width = 60).pack(side=BOTTOM,fill=NONE)
f5 是无.第一个例子不是这种情况:
f5 is None. This is not the case in the first example:
f5 = Frame(mainF, bg = "yellow", height=100, width = 60)
f5.pack(side=BOTTOM,fill=NONE)
简而言之,不推荐串联"方法.这是python中tkinter新用户最常见的错误和头痛的原因之一.
In short terms, the "in line" method is not-recommended. It is one of the most common mistakes and causes of headache for new users of tkinter in python.
None
的原因很简单:pack()
和 grid()
返回 None.
The reason for None
is very simple: pack()
and grid()
return None.
在你的完整代码示例中,mainF
、f4
、f
、f2
都是 None.因此,例如,您认为您正在将 mainF
框架的引用作为 master 传递给 f4
,但实际上您正在传递 None
.
In your full code example, mainF
, f4
, f
, f2
are all None. So for exmaple, you think you are passing a reference to mainF
frame as master to f4
, but in fact you are passing None
.
这篇关于python3 tkinter网格和打包,内联打包语法&优雅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!