Невозможно использовать пакет 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()
причина кода проста, вы не можете использовать пакет и сетку внутри того же класса или для того же фрейма. Таким образом, используйте только один.