Tkinter: pack () фреймы, которые используют grid () - PullRequest
0 голосов
/ 28 октября 2019

Я работаю над интерфейсом для апплета отображения данных. Я начал с учебного пособия и с тех пор расширил его далеко за рамки учебного пособия, но некоторые унаследованные фрагменты остались от учебного пособия, которые теперь вызывают у меня трудности. В частности, относящиеся к pack() и grid().

Следуя инструкции, я определил объект class Window(Frame), который я затем объявляю как app = Window(root), где root = Tk(). Внутри Window объекта есть инициализирующая функция def init_window(self), где возникают мои проблемы. Вот соответствующий код в init_window():

def init_window(self):
    self.master.title('Data Explorer') #changing the widget title
    self.pack(fill=BOTH,expand=1) # allow widget to take full space of root

    # Initializing a grid to place objects on
    self.mainframe = Frame(root)
    self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
    self.mainframe.columnconfigure(0, weight = 1)
    self.mainframe.rowconfigure(0, weight = 1)
    self.mainframe.pack(pady = 10, padx = 10)

, где объект self.mainframe содержит несколько выпадающих списков выбора данных и кнопок позже.

Если я понимаю, что это за кодожидается, что это будет сделано: он устанавливает полное окно для pack() редактирования с различными кадрами. Затем он инициализирует кадр self.mainframe и внутри этого кадра инициализирует grid(). Таким образом pack() и grid() не сталкиваются. Эта установка была построена в соответствии с вышеупомянутым руководством.

Это правильно работает на моем компьютере, где я разрабатываю апплет. Однако, когда соавтор компилирует, он получает

_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

на линии self.mainframe.grid(...). Я заменил команду mainframe.pack() на команду mainframe.place(), но это не решило проблему (так как его компиляция не достигает этой точки);Я не нашел способ удалить команду self.pack(), не вызывая исчезновение всех других элементов моего пользовательского интерфейса.

Может кто-нибудь помочь нам понять, что происходит не так? Для справки, мы используем MacOS и компилируем с Python3. Я могу предоставить дополнительную информацию по запросу в определенных пределах.

1 Ответ

1 голос
/ 28 октября 2019

Ошибка говорит вам, что именно не так. Вы не можете использовать grid для виджета в корневом окне, когда вы уже использовали pack для управления виджетом в корневом окне.

Вы писали:

Затем он инициализирует фрейм self.mainframe и внутри этого фрейма инициализирует grid ()

Нет, это не то, что делает ваш код. Он не устанавливает сетку в кадре, он пытается использовать grid для добавления виджета в корневое окно.

Сначала у вас есть эта строка кода, которая использует pack для виджета в корневом окне:

self.pack(fill=BOTH,expand=1)

Позже вы пытаетесь использовать grid для другого окна в корневом окне:

self.mainframe = Frame(root)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )

Выше не устанавливаетсявверх по сетке в пределах self.mainframe, он использует grid для добавления виджета в корневое окно.

Вам нужно использовать одно или другое, вы не можете использовать оба для разных окон, которые оба являются прямыми потомками корневого окна.

Другими словами, вы делаете это:

self.pack(fill=BOTH,expand=1)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )

, но так как self и self.mainframe являются прямым потомком корневого окна, вы не можете этого сделать,Вам нужно либо использовать pack для обоих:

self.pack(fill=BOTH,expand=1)
self.mainframe.pack(...)

... или grid для обоих:

self.grid(...)
self.mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...