【问题标题】:Python, cannot use geometry manager pack inside [duplicate]Python,不能在内部使用几何管理器包[重复]
【发布时间】:2014-10-11 14:26:57
【问题描述】:
安装 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 之间没有任何语法差异。
我搜索并找不到此错误的任何解决方案。
我什至不知道这是什么意思。
谢谢。
【问题讨论】:
标签:
python-3.x
tkinter
geometry
anaconda
【解决方案1】:
如果您在同一个主窗口中混合使用pack() 和grid(),可能会出现此错误。根据docs,这是个坏主意:
警告:切勿在同一个主窗口中混合使用网格和打包。特金特
将愉快地度过你的余生,试图谈判一个
两位经理都满意的解决方案。与其等待,不如杀死
应用程序,然后再看看你的代码。一个常见的错误
是为某些小部件使用了错误的父级。
例如,此代码适用于 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()。
【解决方案2】:
这个错误意味着你正在做这样的事情:
widget1 = tk.Label(root, ...)
widget2 = tk.Label(root, ...)
widget1.grid(...)
widget2.pack(...)
您不能在具有相同父级的小部件上同时使用 pack 和 grid。它可能适用于一些旧版本的 tkinter,但前提是你很幸运。解决方案是直截了当的:切换到仅使用网格或仅包,用于共享同一父级的所有小部件。
代码在一个版本中似乎可以工作,但在另一个版本中可能不行,因为更高版本使用了更新版本的 tkinter。 Tkinter 并没有给出这个警告——它会尝试继续运行,通常会带来灾难性的结果。该程序是否有效或冻结取决于许多因素。通常程序会冻结并使用接近 100% 的 cpu,有时它会工作,有时它会工作,直到你调整窗口大小。无论如何,你不应该使用任何任何版本的 Tkinter。