无法在几何管理器pack内使用

44

我正在使用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: 在行vertscroll.pack(side="right", fill="y", expand=False)中无法使用几何管理器pack,因为已经存在由网格管理的从属项 .56155888

有什么解决办法吗?

3个回答

71

根据文档,不要在同一个主窗口中混合使用packgrid

警告:永远不要在同一个主窗口中混合使用gridpack。Tkinter 将开心地花费您余生的时间来尝试协商两个管理器都满意的解决方案。而不是等待,杀掉应用程序,并重新检查您的代码。常见错误是对某些小部件使用错误的父级。

因此,如果在文本框上调用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 吧? - user3623888
你可以使用 NSE,但在这种情况下我认为它并不重要。 - unutbu

9
代码的原因很简单,你不能在同一个类或同一个框架中同时使用pack和grid。因此,请仅使用其中一种。

2
为什么“整个代码中只有一个”?每个都有其目的、优点和缺点。当您同时使用两者时,大多数复杂的GUI将更容易编写。 - Bryan Oakley
可以“在整个代码中都使用”两种布局方式。当您制作复杂的GUI时,会使用许多类(从主类即App继承)。每个类都有自己的小部件集。因此,您可以通过分割组件,在某些类中使用pack,在某些类中使用grid。 - Eshita Shukla
1
是的,我知道。我问的是为什么你建议在整个代码中只使用一个。 - Bryan Oakley
你可以为不同的页面创建不同的类。然后,你可以在某些页面上使用pack,在另一些页面上使用grid。 - Eshita Shukla

2
你不能在同一个类或同一个框架中同时使用pack和grid,只能使用其中之一。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接