Python,不能使用几何管理器包里面

时间:2014-08-18 15:52:12

标签: python-3.x tkinter geometry anaconda

安装Anaconda后我遇到了几个错误。 当我运行程序时,我收到消息:

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

该程序是使用Python 3.3编写的。 Anaconda版本适用于3.4。但我不认为3.3和3.4之间存在任何语法差异。 我搜索过,找不到任何解决此错误的方法。 我甚至都不知道这意味着什么。

谢谢。

2 个答案:

答案 0 :(得分:5)

如果在同一主窗口中混合pack()grid(),则会发生此错误。根据{{​​3}},这是一个坏主意:

  

警告:切勿在同一主窗口中混合网格和打包。 Tkinter的   我将很乐意度过余生,努力谈判   两位经理都满意的解决方案。而不是等待,杀死   应用程序,再看看你的代码。一个常见的错误   是为某些小部件使用错误的父级。

例如,此代码适用于Python 3.3.x,但不适用于Python 3.4.x(抛出您提到的错误):

from tkinter import *
from tkinter import ttk

root = Tk()

mainframe = ttk.Frame(root)
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

nb = ttk.Notebook(root)
nb.pack()

root.mainloop()

此代码不适用于两个Python版本:

from tkinter import *
root = Tk()

Label(root, text="First").grid(row=0)
Label(root, text="Second").pack()

root.mainloop()

为避免这种情况,请仅为给定父级的所有子级使用一个几何管理器,例如grid()

答案 1 :(得分:2)

错误意味着你正在做这样的事情:

widget1 = tk.Label(root, ...)
widget2 = tk.Label(root, ...)

widget1.grid(...)
widget2.pack(...)

您不能在具有相同父级的小部件上混合包和网格。 可能可以在某些旧版本的tkinter上运行,但前提是你很幸运。解决方案是直接的:切换到仅使用网格或仅包装,用于共享同一父级的所有小部件。

代码似乎在一个版本中工作但不是另一个版本,因为后一版本使用更新版本的tkinter。 Tkinter没有使用这个警告 - 它会尝试继续运行,通常会带来灾难性的后果。程序是否有效或冻结取决于许多因素。通常程序会冻结并使用接近100%的cpu,有时它会工作,有时它会工作,直到你调整窗口大小。无论如何,你不应该做任何任何版本的Tkinter。