【问题标题】: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。

      【讨论】:

        猜你喜欢
        • 2020-06-10
        • 2014-06-28
        • 2017-03-27
        • 2020-01-24
        • 1970-01-01
        • 2021-11-30
        • 2015-07-19
        相关资源
        最近更新 更多