python3 tkinter网格和打包,内联打包语法&优雅 [英] python3 tkinter grid and pack, inline packing syntax & elegance

查看:39
本文介绍了python3 tkinter网格和打包,内联打包语法&优雅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在线"打包框架与将其放入变量并将其打包到下一行之间有什么区别?

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.

在你的完整代码示例中,mainFf4ff2 都是 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆