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

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

【问题讨论】:

    标签: python tkinter geometry scrollbar


    【解决方案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。只能使用一个

    【讨论】:

      猜你喜欢
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多