Tkinter. субкадр корня не показывает

Вот мой код:

import tkinter as tk import sys class MapCreator: def __init__(self, root): #initialize the root window self.root = root self.root.geometry('800x600+0+0') self.root.resizable(width = False, height = False) self.menubar = None self.mapFrame = tk.Frame(self.root,bd = 2,bg = 'white') self.mapFrame.grid(column = 3, row = 3) #self.mapFrame.pack() self.__create_menubar() def __create_menubar(self): #Create the menubar self.menubar = tk.Menu() #config , which used to change the options self.root.configure(menu = self.menubar) #create a File menu and add it to the menubar #add a new menu file_menu = tk.Menu(self.menubar, tearoff=False) #File cascade self.menubar.add_cascade(label="File", menu=file_menu) #New file_menu.add_command(label="New", command=self.__create_new_map) #Open file_menu.add_command(label="Open", command=self.__open_new_map) #Svae file_menu.add_command(label="Save", command=self.__save_cur_map) #Save as file_menu.add_command(label="Save as", command=self.__saveas_cur_map) def __create_new_map(self): #if not saved , tell the editor pass def __open_new_map(self): #if not saved , tell the editor pass def __save_cur_map(self): #first time save or not pass def __saveas_cur_map(self): pass pass if __name__ == "__main__": root = tk.Tk() app = MapCreator(root) root.mainloop() 

Я хочу иметь подрамник, чтобы показывать другие вещи. Но я не могу найти свой подрамник.

Кстати, я не знаком с методом grid() .

Так может кто-то сказать мне причину, почему я не могу сделать субкадровое шоу?

2 Solutions collect form web for “Tkinter. субкадр корня не показывает”

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

Вот краткое введение в сетку и размер tkinters. Это то, что я предпочитаю, вместо указания высоты и веса.

Представьте, что вы разбиваете родительскую рамку (или какой-либо контейнер) на сетку. Атрибут сетки дочернего объекта позволяет расположить вашего ребенка в определенную часть сетки родителя. Например, вы хотите, чтобы ваш ребенок находился в (0,0) родителя. то вы говорите. child.grid(row=0, column = 0) .

Примечание. Вы не указываете ширину и высоту сетки. Он изменяет размеры до размера дочернего виджета по умолчанию. Кнопка имеет определенный размер. Если дочерний элемент является другим фреймом, и этот кадр пуст. Он не будет виден, потому что размер 1px широкий и 1px высота.

rowspan, columnspan позволяет вам настроить количество строк или столбцов, которые занимает дочерний виджет. Это аналогичная концепция слияния ячеек в таблице Excel. Поэтому, когда вы говорите child.grid(row=0, column = 0, rowspan=2, columnspan=2) вы указываете, что виджет помещен в (0,0) и занимает 2 строки и 2 столбца.

Теперь, когда у вас это есть, как вы его растянете? Это делается с использованием липких и весов. Для дочернего виджета вы указываете липкий. С этим вы определяете направления, которые вы хотели бы растянуть. child.grid(row=0, column = 0, sticky='ew') указывает, что виджет может растягиваться по горизонтали. child.grid(row=0, column = 0, sticky 'nsew') указывает полный растяжку. Указание липкой не растягивает виджет, он просто диктует, какое направление может растягиваться. Вы указываете вес столбца и строки родительской сетки, чтобы указать разные уровни растяжения. parent.grid_columnconfigure(0, weight=1) добавляет вес от 1 до колонки 0. Столбец 0 растянут. Если у вас есть несколько столбцов, которые вы хотите растянуть, тогда вес указывает отношение увеличения между этими разными столбцами. parent.grid_rowconfigure(0, weight=1) делает то же самое для строк.

Учитывая все это. Если вы добавите grid_rowconfigure и grid_columnconfigure в свой корень и добавьте липкий в ваш mapFrame. Вы получите следующее:

 def __init__(self, root): #initialize the root window self.root = root self.root.geometry('800x600+0+0') self.root.resizable(width = False, height = False) self.menubar = None self.mapFrame = tk.Frame(self.root,bd = 2,bg = 'white') self.mapFrame.grid(row = 0, sticky='nsew') self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) #self.mapFrame.pack() self.__create_menubar() 

И это должно работать 🙂

Существует множество других свойств, которые вы можете указать в child.grid() . Другой, который я обычно использую, – padx pady который является дополнением в направлении x, y и ipadx ipady который является внутренним дополнением. Подробнее см. http://effbot.org/tkinterbook/grid.htm.

Рамка появляется. Однако, поскольку в нем нет ничего, это натуральный размер – всего один пиксель в ширину и один пиксель, что делает его практически невидимым.

Поместите что-то в рамку или дайте ему ясную ширину и высоту.

Другой вариант – настроить сетку таким образом, чтобы кадр «прилипал» к сторонам ячейки, в которой он находится, и ячейка расширяется, чтобы заполнить любое дополнительное пространство в окне.

Например:

 self.mapFrame.grid(column = 3, row = 3, sticky="nsew") root.grid_rowconfigure(3, weight=1) root.grid_columnconfigure(3, weight=1) 
  • Ввод данных от пользователя и возврат ответа в TKinter
  • Python / Tkinter: безопасен ли поток Tkinter StringVar (IntVar и т. Д.)?
  • Проблема интеграции с PyObjC и TKinter
  • Использование модуля ImageDraw PIL
  • Пакет сообщений импорта Python tkinter 8.5
  • Диалоги файлов Tkinter в Python 3?
  • Pickle не будет работать с tkinter
  • Установить tkinter и python локально
  • Невозможно заставить функцию работать с кнопками с помощью tkinter
  • Пример кода Tkinter для нескольких окон, почему кнопки не будут загружаться правильно?
  • Событие для текста в текстовом виджете Tkinter
  • Python - лучший язык программирования в мире.