Невозможно использовать пакет geometry manager внутри

поэтому я делаю RSS-ридер с помощью библиотеки tkinter, и в одном из моих методов я создаю текстовый виджет. Он отображается нормально, пока я не попытаюсь добавить к нему полосы прокрутки.

вот мой код до прокрутки:

   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: невозможно использовать пакет geometry manager внутри.56155888, который уже имеет рабов, управляемых сеткой на линии вертскролл.pack (side="right", fill="y", expand=False)

есть идеи, как это исправить?

2 ответов


Per документы, Не смешивайте pack и grid в том же главном окне:

предупреждение: никогда не смешивайте сетку и пакет в одном главном окне. 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()

причина кода проста, вы не можете использовать пакет и сетку внутри того же класса или для того же фрейма. Таким образом, используйте только один.