无法在内部使用几何管理器包

Posted

技术标签:

【中文标题】无法在内部使用几何管理器包【英文标题】:Cannot use geometry manager pack inside 【发布时间】:2014-06-28 08:34:25 【问题描述】:

所以我正在使用 tkinter 库制作一个 rss 阅读器,并在我的一种方法中创建了一个文本小部件。在我尝试向其添加滚动条之前,它显示良好。

这是我在滚动条之前的代码:

   def create_text(self, root):
        self.textbox = Text(root, height = 10, width = 79, wrap = 'word')
        self.textbox.grid(column = 0, row = 0)

这是我的代码:

def create_text(self, root):
        self.textbox = Text(root, height = 10, width = 79, wrap = 'word')
        vertscroll = ttk.Scrollbar(root)
        vertscroll.config(command=self.textbox.yview)
        vertscroll.pack(side="right", fill="y", expand=False)
        self.textbox.config(yscrllcommand=vertscroll.set)
        self.textbox.pack(side="left", fill="both", expand=True)
        self.textbox.grid(column = 0, row = 0)

这给了我错误

_tkinter.TclError: cannot use geometry manager pack inside .56155888 which has been slaves by grid management on the line vertscroll.pack(side="right", fill="y", expand=False)

任何想法如何解决这个问题?

【问题讨论】:

【参考方案1】:

根据the docs,不要在同一个主窗口中混用packgrid

警告:切勿在同一个主窗口中混合使用网格和打包。特金特 将愉快地度过你的余生,试图谈判一个 两位经理都满意的解决方案。与其等待,不如杀死 应用程序,然后再看看你的代码。一个常见的错误 是为某些小部件使用了错误的父级。

因此,如果您在文本框上调用grid,请不要在滚动条上调用pack


import Tkinter as tk
import ttk

class App(object):
    def __init__(self, master, **kwargs):
        self.master = master
        self.create_text()

    def create_text(self):
        self.textbox = tk.Text(self.master, height = 10, width = 79, wrap = 'word')
        vertscroll = ttk.Scrollbar(self.master)
        vertscroll.config(command=self.textbox.yview)
        self.textbox.config(yscrollcommand=vertscroll.set)
        self.textbox.grid(column=0, row=0)
        vertscroll.grid(column=1, row=0, sticky='NS')

root = tk.Tk()
app = App(root)
root.mainloop()

【讨论】:

谢谢!粘性不应该是 NSE 吗? 你可以使用NSE,但在这种情况下我认为这并不重要。【参考方案2】:

代码的原因很简单,你不能在同一个类内或同一个框架中使用 pack 和 grid。因此,只使用一个。

【讨论】:

为什么“整个代码只有一个”?每个人都有一个目的,优点和缺点。当您同时使用这两种方法时,大多数复杂的 GUI 会更容易编写。 它可能有“整个代码”。当你制作一个复杂的 GUI 时,你会使用很多类(继承自主类,即 App)。这些类中的每一个都有自己的小部件集。因此,您可以通过划分组件在某些类中使用pack,在某些类中使用grid。 是的,我知道。我要问的是为什么你建议在整个代码中只使用一个。 你可以为不同的页面制作不同的类。然后,您可以将 pack 用于某些页面,而将 grid 用于其他页面。【参考方案3】:

你不能在同一个类或同一个框架内使用pack和grid。只能使用一个

【讨论】:

以上是关于无法在内部使用几何管理器包的主要内容,如果未能解决你的问题,请参考以下文章

WiX“服务安装”究竟是如何在内部工作的?

python基础 Tkinter 之 几何管理器

python基础 Tkinter 之 几何管理器

在内部架设NuGet服务器(转)

软件包管理rpm

Tkinter模块:Grid几何管理器